java检查数字的平方数字是否不在其多维数据集中

时间:2014-11-26 14:44:42

标签: java arrays

如果正方形中没有任何数字位于其立方体中,则定义要隔离的正数。例如,69是n个孤立数,因为163 * 163 = 26569和163 * 163 * 163 = 4330747,并且方形不包含任何数字0,3,4和7,它们是立方体中使用的数字。另一方面,162不是孤立的数字,因为162 * 162 = 26244和162 * 162 * 162 = 4251528,方形中出现的数字2和4也在立方体中。

写一个名为isIsolated的函数,如果它的参数是一个孤立的数字,则返回1,如果它不是一个孤立的数字,则返回0,如果它不能确定它是否被隔离,则返回-1。

我试过这个:

public static int isIsolated (int n) {
        int square = n*n;
        int cube   = n*n*n;
        int[] a = new int[7];
        int[] b = new int[7];

        if(n < 2097151 || n>1){         
            for(int i=6;i>=0;i--){
                int k = square % 10;
                int l = cube % 10;

                a[i]= k;
                b[j]=l;

                square = square/10; 
                cube = cube/10;
            }

            for(int j=a.length-1;j>=0;j++)
            {
                for(int m=0;m<j;m++)
                {
                    if(a[j] == b[m])
                        return 0;
                    else
                        return 1;
                }
            }
        }
        return -1;
    }

但它没有按预期工作。

我是初学者请帮助我。

5 个答案:

答案 0 :(得分:1)

for(int j=a.length-1;j>=0;j++)

尝试在此处j--而不是j++。看看是否有帮助。

答案 1 :(得分:1)

我想这会导致这个问题:

for(int j=a.length-1;j>=0;j++)
{
    for(int m=0;m<j;m++)
    {
        if(a[j] == b[m])
            return 0;
        else
            return 1;
    }
}

if ... else ...内的return语句将在1次迭代后停止该函数,无论是否找到匹配项。应将return 1;移到for个循环之外。如果找到匹配项,该函数将停止,但如果未找到匹配项,则继续检查数组的全部内容:

for(int j=a.length-1;j>=0;j--) // edit: also change this to j-- as mentioned by Peter
{
    for(int m=0;m<j;m++)
    {
        if(a[j] == b[m])
            return 0;
    }
}
return 1;

答案 2 :(得分:1)

您的代码存在许多问题。

一旦数字耗尽,你就会将0放入数组中,因此任何数字少于7位的数字最终会在数组中至少有一个0并且无法通过测试。

您离开了数组中的默认0,因此任何位于其正方形或其立方体中的0的数字都会出错。此代码表明其立方体适合long的最高隔离数字是:

  

31563被隔离 - ^ 2 = 996222969 ^ 3 = 31443785570547

// Max digits.
private static final int DIGITS = 20;
// Indicates an empty digit.
private static final int EMPTY = -1;
// Max value I can handle.
private static final long MAX = (long) Math.cbrt(Long.MAX_VALUE);

public static int isIsolated(long n) {

    if (n > 1 && n < MAX) {
        long square = n * n;
        long cube = n * n * n;
        long[] a = new long[DIGITS];
        Arrays.fill(a, EMPTY);
        long[] b = new long[DIGITS];
        Arrays.fill(b, EMPTY);
        for (int i = 0; i < DIGITS; i++) {
            if (square > 0) {
                a[i] = square % 10;
                square = square / 10;
            }
            if (cube > 0) {
                b[i] = cube % 10;
                cube = cube / 10;
            }
        }

        for (int i = 0; i < DIGITS; i++) {
            if (a[i] != EMPTY) {
                for (int j = 0; j < DIGITS; j++) {
                    if (a[i] == b[j]) {
                        return 0;
                    }
                }
            }
        }
        return 1;
    }
    return -1;
}

public void test(int n) {
    System.out.println(n + " is " + (isIsolated(n) == 1 ? "" : "not ") + "isolated");
}

public void test() {
    System.out.println("Hello");
    test(1234);
    test(69);
    test(162);
    for (long i = 0; i < MAX; i++) {
        if (isIsolated(i) == 1) {
            System.out.println(i + " is isolated - ^2 = " + (i * i) + " ^3 = " + (i * i * i));
        }
    }
}

答案 3 :(得分:0)

您使用Java,为什么不使用它附带的一些工具。

我会使用Integer.toString(value)从square和cube值生成两个小数点字符串

然后遍历第一个字符串,将所有数字字符放在java.util.Set中。

然后走第二个字符串,检查每个数字字符是否在Set中,如果是,则返回失败案例,如果到达字符串末尾则返回成功。

答案 4 :(得分:0)

static int isIsolated(long n){
    long square = n*n;
    long cube = n*n*n;
    long temp_square = 0;
    long rem_cube = 0, rem_square = 0;
//The maximum positive number that can be
//represented as a long is 63 bits long
    if(n < 2097151 && n > 1){
        while(cube != 0){
            rem_cube = cube % 10;
            cube /= 10;
            temp_square = square;
            while(temp_square != 0){
                rem_square = temp_square % 10;
                temp_square /= 10;
                if(rem_cube == rem_square)
                    return 0;
            }
        }
    return 1;
    }
return -1;    
}