2016-11-10 3 views
0

私はこの問題を解決しようとしています:はなぜプログラムは私にこのメッセージを与えるん:「あまりにも長い間実行するための停止プログラム」を

数81は特別なプロパティ、 の合計の一定の力を持っていますその桁数は81(9乗)です。八十一(81)、 の数字を考慮しないで、このプロパティを持つ最初の数字は です。次は、我々は数字のこの一連のn-th用語を番号を受け取る機能、power_sumDigTerm()を、確認する必要があり、n及び出力してもよい

8 + 1 = 9 and 9^2 = 81 

512 = 5 + 1 + 2 = 8 and 8^3 = 512 

詳細は両方のケースを見てみましょう512です。私たちが上に示した事例は: ですので、私は以下のように問題を解決しました。

ここでは、関数を実行して1を渡すと問題が発生します。powerSumDigTerm(1)出力は期待どおり81になります。しかし、2を渡すと、console.log(powerSumDigTerm(2))という関数は、次のようなメッセージを返します。Program halted for running too long, sorry!誰かがその関数がそれをする理由を説明していますか?それを避ける方法は?

+0

:あなたはまた、通常、怠惰の単なる記号ですwhile(true)ループを避ける必要があります。 IF句を修正する必要があります。 –

+0

findPow関数の意味ですか? –

答えて

1

問題はfindPowの機能の範囲内です。

100の場合を考えてください。合計が1で任意の数値の累乗が1の場合、結果は1になります。つまり、i^x == 1です。したがって、問題を解決するには、特殊ケース1を処理する必要があります。

if (sum <= 1) return false; 

さらに、すぐにStackOverflow例外をスローする再帰を使用しています。私は解決策の下でテストしたところ、n = 15で動作します。複雑さが指数関数的に増加するにつれて、より高い数値を計算するには、最適化されたソリューションが必要です。

function findPow(sum, i) { 
 
    if (sum <= 1) return; 
 
    var counter = 0; 
 
    while (true) { 
 
     counter++; 
 
     if (Math.pow(sum, counter) === i) { 
 
      return true; 
 
     } else if (Math.pow(sum, counter) > i) { 
 
      return false; 
 
     } 
 
    } 
 
} 
 

 
function powerSumDigTerm(n) { 
 
    var index = 80; 
 
    var result = []; 
 

 
    function next() { 
 
     index++; 
 
     var sum = 0; 
 
     var string = index.toString(); 
 
     for (var i = 0; i < string.length; i++) { 
 
      sum += Number(string[i]); 
 
     } 
 
     if (findPow(sum, index)) { 
 
      result.push(index); 
 
     } 
 
    } 
 
    while (result.length < n) 
 
     next() 
 

 
    return result[n - 1]; 
 
} 
 

 
console.log('1:', powerSumDigTerm(1)); 
 
console.log('2:', powerSumDigTerm(2)); 
 
console.log('5:', powerSumDigTerm(5)); 
 
console.log('10:', powerSumDigTerm(10));

+0

あなたの説明は素晴らしいです、私はあなたのソリューションを実行しましたが、プログラムは私にこのメッセージを与えています: 'プロセスは終了しました。完了までに12000ミリ秒以上かかりました。それは、coderwars.comからです –

0

@Adnanが指摘したように、そこにsumが1であれば、それは無限ループに入ります、あなたのfindPow()機能で問題があります。また、スタックオーバーフローの危険性を持っていますエラー。

単純なループでは再帰を使用する意味がありません。 whileループを出て行くことはありませんあなたのプログラミングlogirに障害がある

function findPow(sum, i) { 
 
    for (var pow = 0; sum > 1 && Math.pow(sum, pow) <= i; pow += 1) { 
 
    if (Math.pow(sum, pow) === i) { 
 
     return true; 
 
    } 
 
    } 
 
    return false; 
 
} 
 

 
function sumDigits(number) { 
 
    var sum = 0; 
 
    var str = number.toString(); 
 
    for (var i = 0; i < str.length; i++) { 
 
    sum += Number(str[i]); 
 
    } 
 
    return sum; 
 
} 
 

 
function powerSumDigTerm(n) { 
 
    var result = []; 
 

 
    for (var index = 1; result.length < n; index += 1) { 
 
    if (findPow(sumDigits(index), index)) { 
 
     result.push(index); 
 
    } 
 
    } 
 

 
    return result[n - 1]; 
 
} 
 

 
for (var i = 1; i <= 20; i += 1) { 
 
    console.log(i, powerSumDigTerm(i)); 
 
}

+0

あなたの説明は素晴らしいです、私はあなたのソリューションを実行しましたが、プログラムは私にこのメッセージを与えています: 'プロセスは終了しました。完了までに12000ミリ秒以上かかりました。それはcoderwars.comからです –

+0

最後に 'for'ループを削除しましたか?それはデモンストレーションの目的のためだけのものでした。 – JLRishe

関連する問題