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

解决方案 »

  1.   

    package cn.nuaa.service;public class MinNum
    {
    public static void main(String args[])
    {
    int low = 0, m = 0, n = 0, i = 0;
    long a[] = new long[21]; // 看一下他们的立方
    for (i = 1; i < 21; i++)
    {
    a[i] = i * i * i;
    System.out.print(a[i] + "       ");
    }
    System.out.println( "       ");

    // 循环查找,low,m,n,i代表这4个数,有大小顺序
    for (i = 4; i < 21; i++)
    {
    for (low = 1; low < i - 3; low++)
    {
    for (m = low; m < i - 2; m++)
    for (n = m + 1; n < i - 1; n++)
    {
    if (a[i] + a[low] == a[m] + a[n])
    System.out.print(low + " " + m + " " + n + " " + i);
    break;
    }
    }
    }
    System.out.print("               END!!");
    }
    }
      

  2.   

    一个比较笨但很快就可以想到的办法.写一个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;
           }
      }
    }
      

  3.   

    n1+n2=n3+n4
    n3>n1 n4<n2 
    n3<n1 n4>n2
    循环要从2头向中间查找
      

  4.   

    这个问题的条件还有点问题
    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;
    }
      

  5.   

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

  6.   

    忽略了一些条件,上面的代码有问题,应该还是先找立方和的集合,然后再找相应的整数。int[] sum;
    int[] rst;
    for (int s=4; ; s++) {
        sum = new int[s];
        for (int i=1; i<=s; i++) {
            sum[i] = i*i*i;
        }
        rst = findMinNum(sum);
        if (rst[0] != 0) {
            System.out.printf("find number: x=%d, a=%d, b=%d, c=%d, d=%d", rst[0], rst[1], rst[2], rst[3], rst[4]);
            break;
        }    
    }int[] findMinNum(int[] sum) {
        int[] rst = {0, 0, 0, 0, 0};
        for (int a=0; a<sum.length; a++) {
            for (int c=a+1; c<sum.length; c++) {
                for (int d=c+1; d<sum.length; d++) {
                    for (int b=d+1; b<sum.length; b++) {
                       if (sum[a]+sum[b] == sum[c]+sum[d]) {
                           rst[0] = sum[a]+sum[b];
                           rst[1] = a;
                           rst[2] = b;
                           rst[3] = c;
                           rst[4] = d;
                           return rst;
                       }
                    }
                }
            }
        }
        return rst[0];
    }
      

  7.   

    笔误
    上面的代码
    rst[0] = sum[a]+sum[b]; 
    rst[1] = a+1; 
    rst[2] = b+1; 
    rst[3] = c+1; 
    rst[4] = d+1; 
    return rst; 
      

  8.   

    没有java环境,所以按照上面的代码用javascript写了一个测试,结果是
    find number: x=1729 a=1 b=12 c=9 d=10
    但是不知道这样的x是不是最小的(最好能用数学来证明),可以在一定范围内找x的集合,然后对集合排序,最后输出最小。(可以把下面的注释掉的代码恢复就可以找x集合,可以设置相应的MAX_SET来获得x集合数)<html>
    <script language="javascript">
    var xSet = new Array();
    var rSet = new Array();
    var MAX_SET = 5;
    function unloadMe() {
        //do somthing here
    }function loadMe() {
        var sum;
        var rst;
        var count = 0;
        for (var s=4; ; s++) {
            sum = new Array();
            for (var i=1; i<=s; i++) {
                sum[i-1] = i*i*i;
            }
            
            rst = getMinNum(sum);
            if (rst[0] != 0) {
                rSet[count] = rst;
                xSet[count++] = rst[0];
                //if (count > MAX_SET) {
                    break;
                //}
            }
        }
        xSet.sort(sortMethod);
        for (var i=0; i<rSet.length; i++) {
            if (rSet[i][0] == xSet[0]) {
                showResult(rSet[i], 0);
            } else {
                showResult(rSet[i], 1);
            }
        } 
    }function getMinNum(sum) {
        var rst = new Array(0, 0, 0, 0, 0);
        var len = sum.length;
        for (var a=0; a<len-3; a++) {
            for (var c=a+1; c<len-2; c++) {
                for (var d=c+1; d<len-1; d++) {
                    for (var b=d+1; b<len; b++) {
                        if (sum[a]+sum[b]==sum[c]+sum[d]) {
                            var found = 0;
                            for (var i=0; i<xSet.length; i++) {
                                if (xSet[i] == sum[a]+sum[b]) {
                                    found = 1;
                                    break;
                                }
                            }
                            
                            if (found == 0) {
                                rst[0] = sum[a]+sum[b];
                                rst[1] = a+1;
                                rst[2] = b+1;
                                rst[3] = c+1;
                                rst[4] = d+1;
                                return rst;
                            }
                        }
                    }
                }
            }
        }    
        
        return rst;
    }function showResult(rst, flg) {
        document.write("<p>");
        if (flg == 0) {
            document.write("find number:");
        } else {
            document.write("possible number:");
        }
        document.write(" x=" + rst[0]);
        document.write(" a=" + rst[1]);
        document.write(" b=" + rst[2]);
        document.write(" c=" + rst[3]);
        document.write(" d=" + rst[4]);
        document.write("</p>");
    }function sortMethod(a, b) {
        return a - b;
    }</script>
    <body onload="loadMe();" onunload="unloadMe();">
    </body>
    </html>
      

  9.   

    回elukuangben:  因为从数学的角度讲a[i] + a[low] == a[m] + a[n]是不完全正确的,比如a[m] + a[low] == a[i] + a[n]也是有可能的我认为我那个方法没问题。因为我已经把a[i]限定为最大的那个数,而循环是从最小的数a[low]开始的。
    那么还有2个数m,n一定是他们中间。
      

  10.   


    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();
      

  11.   

    稍微优化了一下: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 = 0;
                int b = 1;
                int c = 2;
                int d = 3;
                bool flag = true;
                while ( flag)
                {
                    b = a + 1;
                    while (b < max - 2 && flag)
                    {
                        c = b + 1;
                        while (c < max - 1 && flag)
                        {
                            d = c + 1;
                            while (Arr[d] <= Arr[c] + Arr[b] - Arr[a] && flag)
                            {
                                if (Arr[a] + Arr[d] == Arr[c] + Arr[b])
                                {
                                    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++;
                }
      

  12.   

    9=1^3+2^3=2^3+1^3a=1,b=2
    c=2,d=1a!=c,b!=d
    可以证明不会有比9再小的了
      

  13.   

    a!=c 
    b!=d那就a=d=1 c=b=2就是了 哈哈~~~貌似跟编程无关哈~~~你给的题不好`
      

  14.   


        static int n=100;//循环次数
        static int m=10;//每次递增数
        public static void main(String[] args) {
        for(int i=1;i<n;i++){
              for(int i1=1;i1<m*i;i1++){
                  for(int i2=i1+1;i2<m*i;i2++){
                      for(int i3=i2;i3<m*i;i3++){
                          int  i4=i3+1;
                          if(i4<m*(i-1))
                          {
                             i4=m*(i-1); 
                          }
                          for(;i4<m*i;i4++){
                              if(i1*i1*i1*i1+i4*i4*i4*i4==i2*i2*i2*i2+i3*i3*i3*i3){
                                  System.out.println(i1+","+i4+"--"+i2+","+i3);
                              }
                          }
                      }
                  }
              }
         
        }
        }
      

  15.   

    算法和以上的不同,不求立方的集合//Testmain.java 
    package minmun;import minmun.Loop;public class Testmain {

    public static void main(String[] args){
    int x=1;
    int times;
    Loop lp=new Loop();

    for(int n=0;n<10;x++){
    //如果想得到多个这样的数,请自行修改for
    //如(int n=0;n<5;x++){...后面的break换成n++
    times=lp.loop(x);

    if(times==2){
    System.out.println(x+"="+lp.a+"^3+"+lp.b+"^3="+lp.c+"^3+"+lp.d+"^3");
    n++;
    }
    }
    }
    }//Max.java
    package minmun;public class Max {

    public int maxMun(int x){

    int mun=0;

    while(mun*mun*mun<x){
    mun++;
    }
    return --mun;
    }
    }//Loop.java
    package minmun;import minmun.Max;public class Loop {

    int a,b,c,d;

    public int loop(int x){

    int times=0;
    a=1;
    b=new Max().maxMun(x);
    c=0;
    d=0;

    for(;b>a;b--){
    for(;a<b;a++){
    if(a*a*a+b*b*b>x)break;
    if(a*a*a+b*b*b==x){
    times++; if(times==1){
    c=a;d=b;
    }
    else{
    if(times==2){
    return times;
    }
    }
    }
    }
    }
    return times;
    }
    }