一个算法题:找一个最小的自然数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();