2017-08-20 1 views
1

私は、この質問が以前に尋ねられたと思う人に親切にお尋ねします。アームストロング数。アームストロングナンバーを入力してください

は、私は私の問題は、私のプログラムが実行され、150に達している時はいつでも、それはこのようにそれがない

(1^3) + ((5^3)-1) + (0^3) 

代わりの

(1^3) + (5^3) + (0^3). 

ないことである1〜10000の間のすべてのアームストロングの番号を印刷する必要がありますもちろん152の結果が出ているので、もちろん153を印刷しないでください(アームストロングの数字です)。他の数字もこれをしているのかどうかはわかりません。しかし、私は200までチェックして、150-160の範囲を除いて他の数字に問題はありません。

これはコンパイルエラーですか?コンパイラを再インストールする必要がありますか?現在、私はコードブロックを使用しています。

#include <iostream> 
#include <math.h> 

using namespace std; 

int main() 
{ 
    for(int i = 0;i <= 10000;++i) 
    { 
     int r = i; 
     int dig = 0; 
     while(r != 0) 
     { 
      dig++; 
      r /= 10; 
     } 
     int n = i, sum = 0; 
     while(n != 0) 
     { 
      int d = n % 10; 
      sum += pow(d, dig); 
      n /= 10; 
     } 
     if(sum == i) 
      cout << i << ' '; 
    } 
    cout << "\n\n\n"; 
    return 0; 
} 
+0

私は自分のコンピュータ上のプログラムを実行し、それがうまく働いた、印刷された:0 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 –

+0

@ZedEvans:あなたはどのようなOSやコンパイラを使用しましたか? –

+0

macOS 10.12。6、Jetbrain CLIonを使用して(どのコンパイラが含まれているか覚えていない) –

答えて

0

デバッガでコードを実行する必要があります。 std::またはusing namespace std;なしでcoutを使用するため、コードは私のためにコンパイルされません(GCC 6)。では、システムでどのようにコンパイルされますか? math.hも使用していますが、C++ではcmathを使用してください。

0 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 

153がそこに含まれているので、あなたのコンパイラのいずれかがエラーを持っているか、あなたのプログラムがあります

はこれを固定した後、私はバージョン6.4.1でg++と私のFedora 24で次の出力を得ます未定義の動作であり、したがってエラーが発生します。

私は definition for Armstrong numbersを見て、本当に短いPython実装をしたしている

# Copyright © 2017 Martin Ueding <[email protected]> 
# Licensed under the MIT/Expat license. 

def is_armstrong(number): 
    digits = [int(letter) for letter in str(number)] 
    score = sum(digit**len(digits) for digit in digits) 
    return score == number 

armstrong = list(filter(is_armstrong, range(10000))) 
print(' '.join(map(str, armstrong))) 

出力はあなたのCに一致する++まさに私のマシン上のプログラム:

あなたのコードを探し
0 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 

私は見つけることができません未定義の動作、それは賢明に見えます。まず、数字の桁数を数えます。おそらく、GCC、LLVM、またはIdeoneのような他のコンパイラで試してみるべきでしょう。コードブロックは独自のコンパイラを出荷するのですか、システムコンパイラを使用していますか?どのオペレーティングシステムを実行していますか?


あなたはプログラムを学習していると言いました。聞くのはクールです! good C++ bookやその他のリソースがあることを願っています。 C++の場合、インターネットには多くの悪いアドバイスがあります。また、C++ 11以上の本を持っていることを確認してください。他のものはすべて古くなっています。

私はあなたのプログラムを変更し、読みやすく、理由が分かりやすいように1つのタスクだけを行う短い機能を作成しました。あなたがすでに関数について知っているかどうかは分かりませんので、今のところ複雑に見えても心配しないでください。

#include <cmath> 
#include <iostream> 

int get_digit_count(int const number) { 
    int digits = 0; 
    int remainder = number; 

    while (remainder > 0) { 
     ++digits; 
     remainder /= 10; 
    } 

    return digits; 
} 

bool is_armstrong_number(int const number) { 
    int const digit_count = get_digit_count(number); 
    int remainder = number; 
    int sum = 0; 

    while (remainder > 0) { 
     int const last_digit = remainder % 10; 
     sum += std::pow(last_digit, digit_count); 
     remainder /= 10; 
    } 

    return number == sum; 
} 

int main() { 
    for (int i = 0; i <= 10000; ++i) { 
     if (is_armstrong_number(i)) { 
      std::cout << i << ' '; 
     } 
    } 
    std::cout << std::endl; 
} 
+0

Martinに感謝します。まず、私はWindows 8.1を使用します。私はちょうどプログラミング言語の初期の学習段階にあるので、コンパイラなどを出荷するかどうかは分かりません。そう、申し訳ありません。私は実際に_using名前空間std_を含んでいます。しかし、以前は言及していなかった。だから、あまりにも申し訳ありません。私は知りませんが、私はループとpow()指数の変数を置くとき、それは動作しません。それは上記の_-1_の結果を再び与える。コンパイラの問題かもしれません。私はおそらく、それまたは他のコンパイラを再インストールするでしょう。大いに感謝する。 – Sri

+0

"pow"指数の "loopと変数"とはどういう意味ですか?あなたの例では、 'pow'は' dig'を2番目のパラメータとして渡します。これは変数です。 –

+0

私は_sum_のためにpow(5,3)を使うと、153を与えます。しかし、上記の_3_の代わりに変数を使用し、_dig_、pow(5、dig)すべての点で、私は関数を扱うのが本当に難しいと思っています。なぜなら、私はちょうどC++を学び始めているからです。しかし、ありがとう。 – Sri

関連する問題