考虑方程式: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
不同解间的顺序可以不考虑。
//有大神解法,,,,原理尚不明确
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int a=1;a<=29;a++){
for(int b=1;b<=29;b++){
for(int c=1;c<=29;c++){
for(int d=1;d<=29;d++){
if(a<b&&b<c&&c<d){
int powa =a*a*a;
int powb =b*b*b;
int powc =c*c*c;
int powd =d*d*d;
if((powa+powd)==(powb+powc)){
System.out.println(a+","+b+","+c+","+d);
}
}
}
}
}
}
}
//本人暴力笨笨的方法
import java.util.*;
public class Init66 {
/**
* @param args
*/
//然后敲出一个set集合加全排列,,,复杂度贼多,,,,,,但是可信度高
static int[] arr = new int[30];
static Set<String> set = new HashSet<String>();
public static void main(String[] args){
List<Integer> a = new ArrayList<Integer>();
List<Integer> b = new ArrayList<Integer>();
for(int i=1;i<30;i++){
a.add(i);
arr[i] =i*i*i;
}
All(a,b);
for(String str:set){
System.out.println(str);
}
}
public static void All(List<Integer> a,List<Integer> b){
if(b.size()==4){
List<Integer> c = new ArrayList<Integer>(b);
if(arr[c.get(0)]+arr[c.get(1)]==arr[c.get(2)]+arr[c.get(3)]){
Collections.sort(c);
set.add(c.get(0)+","+c.get(1)+","+c.get(2)+","+c.get(3));
}
}else{
for(int i=0;i<a.size();i++){
b.add(a.remove(i));
All(a,b);
a.add(i,b.remove(b.size()-1));
}
}
}
}