2016-02-22 31 views
0

任何一個可以告訴我在哪裏出了錯位數的第N個權力

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); 
    } 
} 
+0

是否失敗或超時? – Thomas

+0

它失敗了第二個測試用例,但通過了剩下的3個測試用例 – SmashCode

回答

2

您的算法假定可接受解決方案中的位數小於或等於輸入(功率),但這並非總是如此。如果n = 5,那麼你錯過194,979解決方案爲194,979> 10^5-1所以,你必須增加你正在測試的數字的上限。 (10,n)改爲Math.Pow(10,n + 1) ):

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

「N」的鏈接數量的大小(即在數量,而不是東西,你是位數試圖進入。)所以,如果數字是123456,問題是否(1^6 + 2^6 + 3^6 + 4^6 + 5^6 + 6^6)等於123456.

您提供的for循環,未命中這點。你應該做的是計算給定數字的位數,然後應用while循環的邏輯 - 只有在這種情況下,所有的功率應該是前面計算的位數。

可能將數字轉換爲字符串,並獲得長度,如果空間和時間複雜性不是您擔心的事情,那麼將獲得一行中數字的總位數。

+0

在這些數字之和的10次方中, – SmashCode

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