任何人都可以告诉我哪里出错了
到目前为止我试过这些我通过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);
}
}
答案 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循环的逻辑 - 只有在这种情况下,所有的功率应该是先前计算的位数。
如果空间和时间的复杂性不是你担心的话,可能会将数字转换为字符串并获得长度,该长度可以为您提供一行中数字的总位数。