日期:2014-05-20  浏览次数:20828 次

一个算法题:找一个最小的自然数x,使得:x=a*a*a+b*b*b=c*c*c+d*d*d
找一个最小的自然数x,使它等于不同的两对自然数的三次幂之和,即使得:
  x=a*a*a+b*b*b=c*c*c+d*d*d
其中a,b,c,d都是自然数,且有a!=c和b!=d
要求:输出满足要求的最小自然数的值。
请高手指教.

------解决方案--------------------
把1,2,3。。。的立方计算出来放到一个数组中去,在这个数组里面找出满足条件的4个数。
------解决方案--------------------
一个比较笨但很快就可以想到的办法.写一个for循环.

public class Test {
public static void main(String[] args) {
A: for(int x = 1; x < 50; ++x) //估算x的范围,假定在50范围中求
for(int a = 1; a <= x; ++a)
for(int b = 1; b <= x; ++b)
for(int c = 1; c <= x; ++c)
for(int d = 1; d <= x; ++d) {
if(a != c && b != d && (x == Math.pow(a, 3) + Math.pow(b, 3)) && (x == Math.pow(c, 3)+ Math.pow(d, 3))) {
System.out.println("Result is " + x);
break A;
}
}
}

------解决方案--------------------
n1+n2=n3+n4
n3>n1 n4<n2 
n3<n1 n4>n2
循环要从2头向中间查找
------解决方案--------------------
这个问题的条件还有点问题
a=d, b=c算不算?
如果a,b,c,d都不等,则可以推测
a<c<d<b
int[] findMixNum() {
int[] num = {0, 0, 0, 0, 0};
for (int a=0; ; a++) {
for (int c=a+1; ; c++) {
for (int d=c+1; ; d++) {
for (int c=d+1; ; b++) {
if (b*b*b >= Integer.MAX_VALUE-a*a*a) {
//超出整数范围
num[4] = 0;
return num;
}
num[4] = a*a*a + b*b*b;
if (c*c*c+d*d*d==num[4]) {
num[0] = a;
num[1] = b;
num[2] = c;
num[3] = d;
return num;
}
}
}
}
}
return num;
}

------解决方案--------------------
没测试过
但是对yztommyhc 的做法表示怀疑
因为从数学的角度讲a[i] + a[low] == a[m] + a[n]是不完全正确的,比如a[m] + a[low] == a[i] + a[n]也是有可能的
------解决方案--------------------
C# code

int max = 1290;
            int[] Arr = new int[max];
            for (int i = 0; i < max; i++)
            {
                Arr[i] = (i + 1) * (i + 1) * (i + 1);
            }             
            int a, b, c, d;
            a = b = c = d = 0;
            bool flag = true;
            while (a < max - 3 && flag)
            {
                b = a + 1;
                while (b < max - 2 && flag)
                {
                    c = b + 1;
                    while (c < max - 1 && flag)
                    {
                        d = c + 1;
                        while (d < max && flag)
                        {
                            if (Arr[a] - Arr[b] == Arr[c] - Arr[d])
                            {
                                Console.WriteLine(a + 1);
                                Console.WriteLine(b + 1);
                                Console.WriteLine(c + 1);
                                Console.WriteLine(d + 1);
                                Console.WriteLine(Arr[a] + Arr[d]);
                                Console.WriteLine(Arr[b] + Arr[c]);
                                flag = false;
                            }
                            d++;
                        }
                        c++;
                    }
                    b++;
                }
                a++;
            }
            Console.Read();