/* 考虑方程式:a^3 + b^3 = c^3 + d^3 其中:“^”表示乘方。a、b、c、d是互不相同的小于30的正整数。 这个方程有很多解。比如: a = 1,b=12,c=9,d=10 就是一个解。因为:1的立方加12的立方等于1729,而9的立方加10的立方也等于1729。 当然,a=12,b=1,c=9,d=10 显然也是解。 如果不计abcd交换次序的情况,这算同一个解。 你的任务是:找到所有小于30的不同的正整数解。把a b c d按从小到大排列,用逗号分隔,每个解占用1行。比如,刚才的解输出为: 1,9,10,12 不同解间的顺序可以不考虑。 */ import java.util.Arrays; import java.util.List; import java.util.ArrayList; public class 立方和等式 { // 输出 private static void print(List<int[]> lis) { for(int i=0;i<lis.size();i++){ for(int j=0;j<lis.get(i).length-1;j++){ System.out.print(lis.get(i)[j]+","); } System.out.println(lis.get(i)[lis.get(i).length-1]); } } public static boolean check(List<int[]> lis,int[] n){ if(lis.size()==0){ return true; }else{ int count = 0; for(int i=0;i<lis.size();i++){ for(int j=0;j<n.length;j++){ if(lis.get(i)[j]!=n[j]){ count = 0; break; }else{ count++; } } if(count==4) return false; } } return true; } private static void f(List<int[]> lis) { for(int i=0;i<30;i++){ for(int j=0;j<30;j++){ for(int k=0;k<30;k++){ for(int m=0;m<30;m++){ if(i==j||i==k||i==m|| j==k||j==m||k==m) continue; int a = (int)Math.pow(i, 3); int b = (int)Math.pow(j, 3); int c = (int)Math.pow(k, 3); int d = (int)Math.pow(m, 3); if(a+b==c+d){ int[] temp = new int[]{i,j,k,m}; Arrays.sort(temp); // 排序 if(check(lis,temp)){// 不重复,添加 lis.add(temp); } } } } } } } public static void main(String[] args){ List<int[]> lis = new ArrayList<int[]>(); f(lis); // 得到结果 print(lis); // 输出 } }
运行结果:
1,9,10,12 2,9,15,16 2,18,20,24 10,19,24,27
方法二:(用全排列实现)(m排n)
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.HashSet; public class sortMN { static List<int[]> lis = new ArrayList<int[]>(); // 输出 private static void print(List<int[]> lis) { for(int i=0;i<lis.size();i++){ for(int j=0;j<lis.get(i).length-1;j++){ System.out.print(lis.get(i)[j]+","); } System.out.println(lis.get(i)[lis.get(i).length-1]); } } public static boolean check(List<int[]> lis,int[] n){ if(lis.size()==0){ return true; }else{ int count = 0; for(int i=0;i<lis.size();i++){ for(int j=0;j<n.length;j++){ if(lis.get(i)[j]!=n[j]){ count = 0; break; }else{ count++; } } if(count==4) return false; } } return true; } public static boolean check(int[] n){ Set<Integer> sets = new HashSet<Integer>(); for(int i=0;i<n.length;i++){ sets.add(n[i]); } if(sets.size()==4){ return true; } return false; } public static void oper(int[] n){ int a = (int)Math.pow(n[0], 3); int b = (int)Math.pow(n[1], 3); int c = (int)Math.pow(n[2], 3); int d = (int)Math.pow(n[3], 3); if(a+b==c+d){ int[] temp = new int[]{n[0],n[1],n[2],n[3]}; Arrays.sort(temp); // 排序 if(check(lis,temp)){// 不重复,添加 lis.add(temp); } } } public static void f(int m,int[] n,int k) { if(k==n.length){ if(check(n)){ oper(n); } return ; } for(int i=0;i<m;i++){ n[k] = i; f(m, n,k+1); } } public static void main(String[] args) { int m = 30; int n = 4; f(m,new int[n],0); print(lis); } }
运行结果:
1,9,10,12 2,9,15,16 2,18,20,24 10,19,24,27