数字N在给定限制内供电

时间:2016-02-22 12:57:09

标签: java loops

任何人都可以告诉我哪里出错了

enter image description here

到目前为止我试过这些我通过3个测试用例它失败了一个案例我提供了问题的链接我遇到here是链接这是hackerrank网站提高编码技能的问题

public class Solution {

    public static void main(String[] args) {
        int result = 0;
 Scanner z = new Scanner(System.in);
        int n = z.nextInt();
for (int i = 2; i < Math.pow(10,n)-1; i++) {
    int sum = 0;
    int number = i;
    while (number > 0) {
        int d = number % 10;
        number /= 10;

        int temp = d;
        for(int j = 1; j < n; j++){
            temp *= d;
        }
        sum += temp;
    }

    if (sum == i) {
        result += i;
    }
}
        System.out.println(result);
    }
}

3 个答案:

答案 0 :(得分:2)

您的算法假设可接受解决方案中的位数小于或等于输入(功率),但并非总是如此。如果n = 5,那么你错过194,979解决方案194,979&gt; 10 ^ 5-1因此,您必须增加正在测试的数字的上限。

我的数学技能让我失望,因为我不知道确切的上限应该是什么,但这似乎有效(将Math.pow(10,n)改为Math.Pow(10,n + 1) )):

for (int i = 2; i < Math.pow(10,n+1)-1; i++) {

答案 1 :(得分:0)

您的数学存在许多问题,主要是在循环分隔符上,例如: for(int j = 1; j < n; j++)看起来很可疑,尤其是当你有Math.pow(number%10,n)时。

这似乎是woprk - 我还预先计算了所有精简的数字能力。

private static final int MinDigits = 4;
private static final int MaxDigits = 6;
// Pre-calculate powers of digits.
static final int[][] powers = new int[MaxDigits + 1][10];

static {
    for (int d = MinDigits; d <= MaxDigits; d++) {
        powers[d] = powers(d);
    }
}

/**
 * All digits raised to that power.
 */
private static int[] powers(int n) {
    int[] powers = new int[10];
    for (int d = 0; d < powers.length; d++) {
        powers[d] = (int) Math.pow(d, n);
    }
    return powers;
}

private int sumOfPowersOfDigits(int x, int n) {
    int sum = 0;
    for (int i = 0; i < n; i++) {
        sum += powers[n][x % 10];
        x /= 10;
    }
    return sum;
}

private int sumOfMatchingPowersOfDigits(int n) {
    int sum = 0;
    // Start at 1000... and work up to 10000....
    for (int x = (int) Math.pow(10, n - 1); x < (int) Math.pow(10, n); x++) {
        // Work it out.
        int sumOfPowersOfDigits = sumOfPowersOfDigits(x, n);
        if (sumOfPowersOfDigits == x) {
            // Found one!
            System.out.println("Found " + x);
            sum += sumOfPowersOfDigits;
        }
    }
    return sum;
}

public void test() {
    for (int i = MinDigits; i <= MaxDigits; i++) {
        System.out.println("Sum of " + i + "th powers = " + sumOfMatchingPowersOfDigits(i));
    }
}

答案 2 :(得分:-1)

'n'是数字的大小(即数字中的位数,而不是您要输入的内容。)因此,如果数字是123456,则问题是否(1 ^ 6 + 2 ^ 6 + 3 ^ 6 + 4 ^ 6 + 5 ^ 6 + 6 ^ 6)等于123456。

您提供的for循环错过了这一点。你应该做的是计算给定数字中的位数,然后应用while循环的逻辑 - 只有在这种情况下,所有的功率应该是先前计算的位数。

如果空间和时间的复杂性不是你担心的话,可能会将数字转换为字符串并获得长度,该长度可以为您提供一行中数字的总位数。