题目:
立方数 41063625 (3453) 通过排列可以得到两个另外的立方数: 56623104 (3843) 和 66430125 (4053)。 实际上41063625是最小的三个(不多不少)排列是立方数的立方数。
 
找出最小的立方数,其五个(不多不少)排列是立方数。我的思路是:
设定一个变量p,定义一个长度为p的String数组,
将1到p每个数的立方转换为字符串后,将其各位按升序排列,然后放到这个String数组中,
如果在相同长度的字符串中恰好能找到五个相同的字符串,那么最先出现的那个字符串的下标加上一的立方就是所要求的数了,如果没有找到,就增加p的值,扩大查找范围,直到找到为止,
下面是我写的代码,虽然在eclipse上运行,结果一下子就出来了,但感觉定义的数组太大了,
所以想优化一下,请大家帮忙!!刚注册,没多少分,大家见谅!!!
import java.util.Arrays;public class Oula_62_2 {
final int P=10000;
String[] arr=new String[P];
public static void main(String[] args) {
new Oula_62_2();
}
public Oula_62_2(){
for(int i=1;i<=P;i++){
char[] ch=(((long)i)*i*i+"").toCharArray();
Arrays.sort(ch);
arr[i-1]=new String(ch);
}
int n;
for(int i=0;i<P;i++){
n=1;
int len=arr[i].length();
for(int j=i+1;j<P&&len==arr[j].length();j++){
//System.out.println(arr[i].equals(arr[j]));
if(arr[i].equals(arr[j]))n++;
}
if(n==5){
System.out.println(((long)i+1)*(i+1)*(i+1));
break;
}
}
}
}

解决方案 »

  1.   

    把数组定义成long[]
    public void find2()
    {
    long[] arr = new long[P];
    for (int i = 1; i <= P; i++)
    {
    char[] ch = (((long) i) * i * i + "").toCharArray();
    Arrays.sort(ch);
    int count=ch.length;
    for(int j=0;j<count/2;j++)
    {
    char tmp=ch[j];
    ch[j]=ch[count-1-j];
    ch[count-1-j]=tmp;
    }
    arr[i - 1] = Long.parseLong(new String(ch));
    }
    int n;
    for (int i = 0; i < P; i++)
    {
    n = 1;
    for (int j = i + 1; j < P ; j++)
    {
    // System.out.println(arr[i].equals(arr[j]));
    if (arr[i]==arr[j])
    n++;
    }
    if (n == 5)
    {
    System.out.println(""+(i+1)+"^3="+((long) i + 1) * (i + 1) * (i + 1));
    break;
    }
    }
    }
      

  2.   

    我也想过不用String类型,但是考虑到有如下问题:
    如果这个立方数中有一个或者多个0,那么在进行排序后,0就到了最左边,然后转换为long类型后,左边的0都没有了,这样进行比较是不是会有问题呢?