2017-03-02 170 views
1

我一直在這樣的挑戰掙扎,似乎無法找到我在哪裏失敗:A碼的戰爭挑戰

一些數字有滑稽性。例如:

89 --> 8¹ + 9² = 89 * 1 

695 --> 6² + 9³ + 5⁴= 1390 = 695 * 2 

46288 --> 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51 

給定一個正整數n寫成ABCD ...(A,B,C,d ...暫時位數),我們希望找到一個正整數k爲正整數P,若它存在,例如n的數字的總和乘以p的連續冪等於k * n。換句話說:

是否存在整數k,例如:(a^p + b ^(p + 1)+ c ^(p + 2)+ d ^(p + 3)+ ...)= n * k 如果是這種情況,我們將返回k,否則返回-1。

注意:n,p將始終作爲嚴格正整數給出。

digPow(89, 1) should return 1 since 8¹ + 9² = 89 = 89 * 1 
digPow(92, 1) should return -1 since there is no k such as 9¹ + 2² equals 92 * k 
digPow(695, 2) should return 2 since 6² + 9³ + 5⁴= 1390 = 695 * 2 
digPow(46288, 3) should return 51 since 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51 

我是新來的JavaScript,所以可能有一些東西與我的代碼,但我找不到它。我的整個目的是爲了正確學習javascript,但現在我想知道我在做什麼錯了。我試着將給定的整數轉換爲數字,並用10取模,然後用trunc將其除以10以除去小數部分。我試圖用它們各自的權力填充這些數字。但測試結果只是說我只返回在我的代碼返回0 0.The唯一的事情是第一部分,但是當我試圖註釋掉它,我還是回到0

function digPow(n, p){ 
// ... 
var i; 
var sum; 
var myArray= new Array(); 
if(n<0) 
    { 
    return 0; 
    } 
var holder; 
holder=n; 
for(i=n.length-1;i>=0;i--) 
{ 
    if(holder<10) 
    { 
    myArray[i]=holder; 
    break; 
    } 
    myArray[i]=holder%10; 
    holder=math.trunc(holder/10); 
    myArray[i]=math.pow(myArray[i],p+i); 
    sum=myArray[i]+sum; 

} 
if(sum%n==0) 
    { 
    return sum/n; 
    } 
else 
{ 
    return -1; 
}} 
+1

如果'N'是一個數字它不會有一個'length'屬性。所以'i'將會是'undefined',並且因爲'undefined'不大於或等於零,所以你的循環永遠不會運行。 –

+0

我明白了,是你唯一可以看到的問題嗎?我想我需要閱讀更多關於屬性 – Morbidity

回答

1

錯誤

您的代碼有幾個問題。這是你犯的一些錯誤。

  1. number.length無效。在JS中獲取數字長度的最簡單方法是將其轉換爲字符串,如下所示:n.toString().length。 檢查這個:Length of Number in JavaScript

  2. 數學對象應該被引用爲數學,而不是數學。 (注意是大寫的M)所以math.pow和math.trunc應Math.powMath.trunc

  3. sum在for循環第一次在sum=myArray[i]+sum;中迭代時未定義。使用var sum = 0;而不是var sum;

固定碼

我固定的錯誤,並更新你的代碼。有些部分已被刪除 - 例如驗證n(該問題表明其嚴格肯定) - 而其他部分已被重寫。我做了一些文體修改,以使代碼更具可讀性。

function digPow(n, p){ 
 
var sum = 0; 
 
var myArray = []; 
 
var holder = n; 
 

 
for (var i = n.toString().length-1; i >= 0; i--) { 
 
    myArray[i] = holder % 10; 
 
    
 
    holder = Math.trunc(holder/10); 
 
    myArray[i] = Math.pow(myArray[i],p+i); 
 
    sum += myArray[i]; 
 
} 
 

 
    if(sum % n == 0) { 
 
    return sum/n; 
 
    } else { 
 
    return -1; 
 
    } 
 
} 
 

 
console.log(digPow(89, 1)); 
 
console.log(digPow(92, 1)); 
 
console.log(digPow(46288, 3));

我的代碼

這是我做過什麼回來時,我回答了這個問題。希望這可以幫助。

function digPow(n, p){ 
 
    var digPowSum = 0; 
 
    var temp = n; 
 
    
 
    while (temp > 0) { 
 
    digPowSum += Math.pow(temp % 10, temp.toString().length + p - 1); 
 
    temp = Math.floor(temp/10); 
 
    } 
 
    
 
    return (digPowSum % n === 0) ? digPowSum/n : -1; 
 
} 
 

 
console.log(digPow(89, 1)); 
 
console.log(digPow(92, 1)); 
 
console.log(digPow(46288, 3));

+1

不知道屬性的大小寫敏感問題。它非常有幫助,非常感謝Madusha – Morbidity

+0

沒問題。很高興成爲一名幫助。 – Madusha

0

我創建一個完全符合你的要求的代碼。在你的代碼中的問題已經在評論中解釋過了,所以我不會把重點放在這個問題上。

FIDDLE

這裏是代碼。

function digPow(n, p) { 
    var m = n; 
    var i, sum = 0; 
    var j = 0; 
    var l = n.toString().length; 
    var digits = []; 
    while (n >= 10) { 
    digits.unshift(n % 10); 
    n = Math.floor(n/10); 
    } 
    digits.unshift(n); 
    for (i = p; i < l + p; i++) { 
    sum += Math.pow(digits[j], i); 
    j++; 
    } 
    if (sum % m == 0) { 
    return sum/m; 
    } else 
    return -1; 
} 

alert(digPow(89, 1)) 
0

您有多個問題:

  1. 如果n是一個數字它不會有一個length屬性。所以i將是undefined,你的循環永遠不會運行,因爲undefined是你從來沒有初始化sum爲0,所以它是undefined,但不大於或等於零

    for(i=n.length-1;i>=0;i--) //could be 
    for(i=(""+n).length;i>=0;i--) //""+n quick way of converting to string 
    
  2. 當你添加動力計算的結果綜上所述,你會不斷地得到NaN

    var sum; //should be 
    var sum=0; 
    
  3. 你有if(holder<10)...break你不需要以此爲循環將迭代之後到底哪裏持有者是小於10。此外你永遠做一個輸出F或者將其添加到sum。簡單地刪除,如果一起。

您的最終代碼會看起來像:

function digPow(n, p) { 
    var i; 
    var sum=0; 
    var myArray = new Array(); 
    if (n < 0) { 
    return 0; 
    } 
    var holder; 
    holder = n; 
    for (i = (""+n).length - 1; i >= 0; i--) { 
    myArray[i] = holder % 10; 
    holder = Math.trunc(holder/10); 
    myArray[i] = Math.pow(myArray[i], p + i); 
    sum = myArray[i] + sum; 
    } 
    if (sum % n == 0) { 
    return sum/n; 
    } else { 
    return -1; 
    } 
} 

注意你可以苗條下來的東西像

function digPow(n,p){ 
    if(isNaN(n) || (+n)<0 || n%1!=0) return -1; 
    var sum = (""+n).split("").reduce((s,num,index)=>Math.pow(num,p+index)+s,0); 
    return sum%n ? -1 : sum/n; 
} 
  • (""+n)簡單地轉換爲字符串
  • .split("")分裂將字符串轉換爲數組(不需要nee d做10%的數學得到每個數字
  • .reduce(function,0)通話的陣列的減少功能,這就要求數組中的每一項功能。該功能預計將每次返回一個值,第二個參數是初始值
  • (s,num,index)=>Math.pow(num,p+index+1)+s發箭功能只調用Math.pow用正確的參數,然後將它添加到總和s並返回其
0

只是爲了各種你可能在功能上做同樣的工作,而無需使用任何字符串操作如下。

function digPow(n,p){ 
 
    var d = ~~Math.log10(n)+1; // number of digits 
 
     r = Array(d).fill() 
 
        .map(function(_,i){ 
 
         var t = Math.pow(10,d-i); 
 
         return Math.pow(~~((n%t)*10/t),p+i); 
 
         }) 
 
        .reduce((p,c) => p+c); 
 
    return r%n ? -1 : r/n; 
 
} 
 

 
var res = digPow(46288,3); 
 
console.log(res);