2016-08-30 12 views
0

数値の桁の和を求める必要があります。例えば、番号1123の桁の和は1 + 1 + 2 + 3 =数値の桁の合計を求める(c)

7私の考え:

1)ユーザーが入力および整数

2)Iは、の数を計算します数字の桁(4桁以上の場合)

3)forループを使用するより、私はユーザーの数を1,2の桁に分割します。数字の桁数(最後の数字は含まない)数字を合計します。ここで

は私のコードです:

int main (void) 
{ 
    int result,sum,n; 
    int div = 10,counter = 0,number; 

    printf("Enter the integer:"); 
    scanf("%i",&number); 
    while(result >0){ 
     result = number/div; 
     div *= 10; 
     ++counter; 
    } 
    printf("The number consists of %i digits\n",counter); 
    sum = 0; 

    for(n=1;n<counter;++n){ 
     sum += number/pow(10,n); 
    } 
    printf("%i",sum); 

    return 0; 


} 

(whileループ)最初の部分は個別に正しい動作します。しかし、2番目の部分(forループ)と一緒に私は間違った結果を返します(whileループの0桁と合計もゼロです)。なぜそれが起こるのか説明できますか? ソリューションを修正するにはどうすればよいですか?

P.S私の問題のより効率的な解決策が存在することは知っていますが、自分のアルゴリズムを使用したいと思います。

+1

int型に直接入力しません。文字列として入力します。これは長さの計算を簡単にし、文字列をchar aarrayとして扱い、個々の数字をループしてintに変換し、 –

+0

を加算します。 '10'の累乗で除算すると、数字は得られません。あなたはそれと一緒にモジュラス '10'を使う必要があります。 –

+0

'div * = 10;'がオーバーフローすると問題になります。 – chux

答えて

2

をいくつかの問題:あなたが最初whileループを入力すると

  • は、resultが初期化されていません。初期化されていない変数を読み取ろうとすると、undefined behaviorとなります。
  • 除算を実行すると、数字は加算されません。 1123の場合、実際には112 + 11 + 1を追加しています。数字を取得するには、除算の代わりにモジュラスを使用する必要があります。

あなたは次のように単一のループに追加すると数字のカウントを行うことができます。すべての

sum = 0; 
while(number > 0){ 
    sum += number % 10; 
    number /= 10; 
    ++counter; 
} 
printf("The number consists of %i digits\n",counter); 
printf("%i",sum); 
1

ははるかに簡単:

result = number; 
sum = 0; 
counter = 0; 
while(result != 0){ 
    sum += result % 10; 
    result /= 10; 
    ++counter; 
} 

printf ("Counter:%d sum:%d\n", counter, sum); 
0

コード内の多くのエラーがありますが、全体的に全体的なアプローチは間違っています。数字を数えることは不要です。

簡単な方法は次のようになります。あなたは(条件がtemp != 0と同等であるとしてtemptempが0になるので、ループを停止する際に知って

unsigned temp = number, sum = 0; 
while (temp) { 
    sum += temp % 10; 
    temp /= 10; 
} 

注意してください。あらかじめ桁数を知る必要はありません。

0

あなたのコードと一緒に行く場合、これは動作します:ここに

for(n=1;n<=counter;++n){ 
    sum += number%10; 
    number /= 10; 
} 
printf("%d",sum); 
1

まず、最高のデバッグのために、12345

のように、異なる数字を持っている番号を使用します

デバッグを行うには、数字を累積することとは別に計算して印刷します。それは代わりにsum += <... complex code ...>で、である、このようにそれを実行します。

int digit = ... 
printf("Next digit is %i\n", digit); 
sum += digit; 

また(デバッグすることでこれを発見しなければならないが、それは直接注意することは十分に明らかだ)、数字の計算のためのあなたのアルゴリズムが間違っています。 powは精度が限られている浮動小数点演算を使用していますので、私は、ここにpowを使用していない

int div = 1; 
for (...) 
{ 
    digit = number/div % 10; 
    div *= 10; 
} 

注:このような何かを行います。 intの精度が64ビットの場合(可能性は低いと考えられますが)、浮動小数点は大量の場合ナンセンスを計算します(精度はわずか53ビットです)。

+0

'pow()'の制限についての良い見識。 – chux

0

簡単なソリューション:

int c, n=0, sum=0; 
printf("Enter number"); 
while((c=getchar())!='\n') { // IMPORTANT: '\n' in unix, '\r' in windows 
    if(c<'0' || c>'9') { 
     printf("Bad value"); 
     break; 
    } 
    sum+=c-'0'; // c is the ASCII code of the digit, so you have to subtract an offset 
    n++; 
} 
printf("Number of digits: %d", n); 
printf("Sum of digits: %d", sum; 
+0

ありがとう、私はそれらを修正し、文字が本当に数字であるかどうかを確認するifを追加しました。 –

+0

それが(c <'0' || c> '9')の場合です。 ... –

+0

'isdigit(char)'関数を使って数値であるかどうかを調べることができます。 'atoi(char *)'は – Tiko

関連する問題