2016-09-22 18 views
-1

ちょうど今、私はC言語で++のコードを使ってナルシシジスなのかどうかを判断し、私は最も独特なものを見つけました。私はナルシシスティックな数字9800817と9926315の関数 "IsNumberNarcissistic"で間違った和を得ています。私が得た合計は、常に1より小さく、それぞれ9800816と9926314です。しかし、変数sumをdoubleとして宣言することで問題は解決されます。Code :: Blocks 13.12 C++の間違った答えの合計

私の質問は、ここで何が起こっているのですか?それはCode:Blocks関連の問題なのでしょうか?私はコードを使用しています:ブロック13.12。前もって感謝します。

PS。私がこの機能で作ったプリントを気にしないで、変数値を見るためにそこに置いておきます。

#include <iostream> 
    #include <vector> 
    #include <cmath> 
    #include <iomanip> 

    using std::cin; using std::cout; using std::endl; 

    std::vector<int> extractDigits(int n) 
    { 
     std::vector<int> digits; 
     while (n>0) 
     { 
      digits.push_back(n%10); 
      n/=10; 
     } 
     return digits; 
    } 

    bool IsNumberNarcissistic(int n) 
    { 
     auto digits = extractDigits(n); 
     int sum(0); 
     int power = digits.size(); 
     for (int digit : digits) sum += std::pow(digit, power); 
     for (int digit : digits) cout << std::setprecision(10)  
     << std::pow(digit, power) << endl; 
     cout << endl << endl << sum; 
     return (sum == n); 
    } 

    int main() 
    { 
     IsNumberNarcissistic(9800817); 
    } 
+1

_ "それはコードです:ブロックに関連する問題、または何か他のもの?" _私が言うと思います何か他のもの。 IDEはめったに原因ではありません。ターゲットプラットフォームとツールチェーンの使用に関連しています。 –

+0

['std :: pow'](http://en.cppreference.com/w/cpp/numeric/math/pow)は浮動小数点関数なので、丸めの問題につながる可能性があることに注意してください。 –

+3

あなたの問題は、おそらく 'sum + = std :: pow(digit、power)'から来るでしょう。デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

答えて

0

コメントはすでにあなたの質問に答えているので、私はこのコミュニティWikiをマークしています。

私はナルシシズムの数字を聞いたことがないので、私はちょっと対象を探索するために適切に動作するコードのバージョンを作った。

std::powは、IPowで置き換えられます。整数累乗関数は、標準の2進数/ 2乗法を使用します。

#include <iostream> 
#include <vector> 

std::vector<int> ExtractDigits(int n) { 
    std::vector<int> digits; 
    if(n < 0) { n = -n; } 
    do { 
     digits.push_back(n % 10); 
    } while(n /= 10); // 0 has 1 digit 
    return digits; 
} 

int IPow(int b, int e) { 
    if(e < 0) return 0; // truncated fraction 
    int s = b; 
    int r = 1; 
    while(e) { 
     if(e % 2) { r *= s; } 
     s *= s; 
     e /= 2; 
    } 
    return r; 
} 

bool IsNumberNarcissistic(int n) { 
    const auto digits = ExtractDigits(n); 
    int sum = 0; 
    const int power = digits.size(); 
    for (int digit : digits) { sum += IPow(digit, power); } 
    for (int digit : digits) { 
     std::cout << digit << "**" << power << " " << IPow(digit, power) << '\n'; 
    } 
    std::cout << "sum: " << sum << '\n'; 
    return sum == n; 
} 

int main() { 
    for(int n : { 9800817, 9800818, 50 }) { 
     std::cout << n << " is" << (IsNumberNarcissistic(n) ? "" : " not") 
      << " Narcissistic\n\n"; 
    } 
} 

出力

7**7 823543 
1**7 1 
8**7 2097152 
0**7 0 
0**7 0 
8**7 2097152 
9**7 4782969 
sum: 9800817 
9800817 is Narcissistic 

8**7 2097152 
1**7 1 
8**7 2097152 
0**7 0 
0**7 0 
8**7 2097152 
9**7 4782969 
sum: 11074426 
9800818 is not Narcissistic 

0**2 0 
5**2 25 
sum: 25 
50 is not Narcissistic 
関連する問題