for(int i=0;i<10;i++){ sum = sum.add(
pw[i].multiply(BigInteger.valueOf(nn[i]))); }
String s = \
if(s.length()!=21) return; // 确定各数字出现的多少次 int[] nn2 = new int[10]; for(int i=0;i<21;i++){ nn2[s.charAt(i)-'0']++; }
for(int i=0;i<10;i++){
if(nn[i]!=nn2[i]) return; }
System.out.println(s); }
public static void f(BigInteger[] pw, int[] nn, int cur, int use){ if(cur==9){
nn[9] = 21 - use; ji_suan(pw,nn); return; }
// 对当前位置所有可能进行枚举 for(int i=0;i<21-use;i++){ nn[cur] = i;
f(pw,nn,cur+1,use+i); }
}
public static void main(String[] args){
long startTime = System.currentTimeMillis(); // 程序开始时间 BigInteger pw[] = new BigInteger[10]; for(int i=0;i int nn[] = new int[10]; f(pw,nn,0,0); System.out.println(\ long endTime = System.currentTimeMillis(); // 程序结束时间 System.out.println((endTime-startTime)/1000f+\秒\ // 运行总时间 } } 运行结果: 128468643043731391252 449177399146038697307 OK 27.343秒 26 方法三: import java.math.BigInteger; import java.util.Arrays; /** * 如题,求解21位花朵数的解法,要求在3分钟之内计算完成花朵数: N位整数,它等于各个位的数字的N次方之和, * * 例如有一个N位数字,a1a2a3a4.....aN = a1^N +a2^N+......aN^N * * @author hb */ public class FlowerNum { private static int num = 21; private static BigInteger[] table = new BigInteger[10]; private static int[] nums; private static int[] a=new int[10]; public static void main(String[] args) { long time = System.currentTimeMillis(); for (int i = 0; i < 10; i++) table[i] = BigInteger.valueOf(i).pow(num); nums = new int[num]; find(nums, 0, 0); //f(); time = System.currentTimeMillis() - time; System.out.println(time / 1000.0 + \ } /** * level表示第几位数,num表示第几位数的数字; */ public static void find(int[] nums, int level, int num) { nums[level] = num; if (level == nums.length - 1) { BigInteger big = sum(nums);//当level为20时,表示nums数组下标为20即21位数字满后求和; int[] temp = getArray(big);//将得到的21位数和转化为整形数组;并返回; if (check(nums, temp))//测试是否是21位,并将数组复制给nums数组; System.out.println(big);//输出big数; return; } for (int i =num; i < 10; i++)//递归;查找21位数字符合条件的数; find(nums, level + 1, i); } /** * 检测长度,若符合条件就复制a2到a1; * @param a1 * @param a2 * @return 27 */ public static boolean check(int[] a1, int[] a2) { if (a1.length != a2.length) return false; //Arrays.sort(Arrays.copyOf(a1, a1.length)); Arrays.sort(a1); Arrays.sort(a2); return Arrays.equals(a1, a2); } /** * 得到nums数组的数做为table下标的数的和。并返回; * @param nums * @return */ public static BigInteger sum(int[] nums) { BigInteger sum = BigInteger.ZERO; for (int i = 0; i < nums.length; i++) sum = sum.add(table[nums[i]]); return sum; } /** * 将BigInteger转化为int[]类型数据; * @param big * @return */ public static int[] getArray(BigInteger big) { String s = String.valueOf(big); char[] ch = s.toCharArray(); int[] res = new int[ch.length]; for (int i = 0; i < ch.length; i++) res[i] = ch[i] - '0'; return res; } public static void f(){ for(a[0]=0;a[0]<=21;a[0]++){ for(a[1]=0;a[1]<=21-a[0];a[1]++){ for(a[2]=0;a[2]<=21-a[0]-a[1];a[2]++){ for(a[3]=0;a[3]<=21-a[0]-a[1]-a[2];a[3]++){ for(a[4]=0;a[4]<=21-a[0]-a[1]-a[2]-a[3];a[4]++){ for(a[5]=0;a[5]<=21-a[0]-a[1]-a[2]-a[3]-a[4];a[5]++){ for(a[6]=0;a[6]<=21-a[0]-a[1]-a[2]-a[3]-a[4]-a[5];a[6]++){ for(a[7]=0;a[7]<=21-a[0]-a[1]-a[2]-a[3]-a[4]-a[5]-a[6];a[7]++){ for(a[8]=0;a[8]<=21-a[0]-a[1]-a[2]-a[3]-a[4]-a[5]-a[6]-a[7];a[8]++){ a[9]=21-a[0]-a[1]-a[2]-a[3]-a[4]-a[5]-a[6]-a[7]-a[8]; BigInteger sum=BigInteger.ZERO; for(int i=0;i<10;i++){ 28 BigInteger(String.valueOf(a[i])))); } } } } } } sum=sum.add(table[i].multiply(new } if(String .valueOf(sum).length()==21){ } String str=sum.toString(); int b[]=new int[10]; for(int index=0;index boolean f=true; int i=0; for(;;){ if(i==10)break; if(b[i]!=a[i]){f=false;break;} i++; int flag=str.charAt(index)-'0'; b[flag]+=1; } if(f)System.out.println(sum.toString()); } } } } } 11.猜生日 今年的植树节(2012年3月12日),小明和他的叔叔还有小伙伴们一起去植树。 休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!” “把我出生的年月日连起来拼成一个8位数(月、日不足两位前补0)正好可以被今天的年、月、日整除!” 他想了想,又补充到:“再给个提示,我是6月出生的。” 根据这些信息,请你帮小明算一下,他叔叔的出生年月日。 答案写在“解答.txt”中,不要写在这里! 格式是年月日连成的8位数。 例如,如果是1948年6月12日,就写:19480612 package Question10_19; publicclass Question11 { publicstaticvoid main(String[] args) { for (int i = 20120312; ; i--) { String s=\+i; intyear=Integer.parseInt(s.substring(0, 4)); 29 } } } int month=Integer.parseInt(s.substring(4, 6)); int day=Integer.parseInt(s.substring(6, 8)); System.out.println(year+\ if(day==0||day>31){ } if(!(i 12==0&&i%3==0&&i==0)){ } if(month!=6){ } System.out.println(i); break; continue; continue; continue; // 运行结果: 19550604 方法二: public class Demo02 { public static void main(String[] args){ int n = 20120312; String s = \ for(int i=19000601;i<=20130312;i++){ s = \ int d = Integer.parseInt(s.substring(6)); // 得到天 int m = Integer.parseInt(s.substring(4,6)); // 得到月 if(d==0) continue; if(d>=1&&d<31&&m==6&&i 12==0&&i%3==0&&i==0){ System.out.println(i); } } } } 运行结果: 19550604 12.填算式 看这个算式: ☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字。 这个算式有多少种可能的正确填写方法? 30