家・車以外で、人生で一番奮発した買い物

一つの正整数を引数として受け取り、
その整数の各桁の和を返す関数を作成する。
この関数を用い、いくつかの正整数を入力して
その整数の各桁の和を表示する。
入力の終わりは、0または負のデータが現れたことで
判定する。

というC言語の問題なんですが、
整数の各桁の和を返す関数がうまくできません・・。
123が15となってしまいます・・。
とりあえず最初の部分を作ってみました。
初心者なのでミス多いかもしれませんが
どなたか教えていただけませんか?

#include<stdio.h>
#include<conio.h>
int sum(int n)
n=(n/10)+(n%10);

return n;
}
main()
{
int n,sum2;
scanf("%d",&n);
sum2=sum(n);
printf("%d",sum2);
}

A 回答 (5件)

こんな感じでしょうか。


#include <stdio.h>

int sum(int n) {
int sum=0;
if (n<0) return 0;
while (n>0) {
sum += n%10;
n /= 10;
}
return sum;
}

int main(void) {
int n;
while(1) {
scanf("%d",&n);
if (n<=0) break;
printf("%d\n",sum(n));
}
return 0;
}
    • good
    • 1

>というC言語の問題なんですが、



 おそらく、期待される「答え」ではない、と思われますのでソースを投稿します。
        ( Borland C++ 5.6.4 )

 こんな方法もあるんだ、と見て頂ければ・・。
-------------------------------------------
★整数を文字列にして、和を求める方法です。

  123 → '1' + '2' + '3' = 6

1.scanf() は、正常に入力した項目数を返します。
  先頭にピリオド、途中に英文字等の「入力」で試して下さい。
  → 返った項目数を判定することで、想定外入力に対応できます。

  ちなみに、123+456+789+987+654+321 と入力すると・・・?。

2.下の sprintf() は、"%d" の書式で文字列を作り、かつ文字列の終了を表すヌル文字( 0x00 )を付加します。

(3.GetSum() 関数内は、ポインタを使った書き方も可能です。)

《蛇足》
コンパイル時に、メイン関数の return( -1 ); 行に警告等がでましたら、「処理系」を補足して下さい。
------------------------------------------
#include <stdio.h>

int GetSum( char cStr[] )
{
 int iTotal = 0, k = 0;

 while( cStr[ k ] ){ // 文字列終端 0x00 の前まで

  iTotal += ( cStr[ k ] - 0x30 ); // 参考URL

  k++;
 }
 return( iTotal );
}
int main( void )
{
 int n, iSum2;
 char cStr[16];

 while( 1 == scanf( "%d", &n ) ){

  sprintf( cStr, "%d", n ); // 整数 → 文字列

  if( '-' == cStr[0] ) break; // 負のデータ/終了
  if( '0' == cStr[0] ) break; // 0のデータ/終了

  iSum2 = GetSum( cStr );

  printf( "%c%s%c %d\n", 0x22, cStr, 0x22, iSum2 );
 }
 return( -1 ); // 0-255
}
注:インデントに全角空白を用いています。タブに一括変換して下さい。
-------------------------------------
おそらく、「期待される『答え』」に近いものは、下のようになるのでは・・。
 
  for( i = 0; i < 13; i++ ){ // int 型
 
   if( 0 == n ) break;
 
   iSum2 += ( n % 10 );

   n /= 10; // 下位より切り崩し
  }
  ↑未確認です。

参考URL:http://e-words.jp/p/r-ascii.html
    • good
    • 0

不慣れなうちは自分がコンピュータになったつもりで、紙の上で試行錯誤してみましょう。


(今回のn/10のところの誤りもそうすればすぐに分かったはずです)

各桁の和を計算するためには各桁の数字を取り出さないとならないわけですが、ではどうすればいいのか?
一部おわかりのようですが、10進数で表された数は各桁ごとに1,10,100,1000...と10倍ずつになっているので、逆に割ってやれば各桁の数が取り出せます。
ただし割っただけだとその上の桁の数もついてきてしまいますから、欲しい桁だけにするために%10することが必要となります。

また、桁数としては1からintで表せる最大の値の桁数まであり得るわけですから、それについても考慮する必要があります。
ループ文について学んでいれば、それを使います。その場合は#2の回答のロジックになります。
    • good
    • 0

123の場合:


各桁の和を0で初期化する

123を10で割り、商(12)とあまり(3)を求める。
あまり(3)を各桁の和に加える。
各桁の和は3になる。

12を10で割り、商(1)とあまり(2)を求める。
あまり(2)を各桁の和に加える。
各桁の和は5になる。

1を10で割り、商(0)とあまり(1)を求める。
あまり(1)を各桁の和に加える。
各桁の和は6になる。

これ以上続けても意味がないので、計算を終える。
最終結果は6となる。

以上のロジックをコード化してください。
    • good
    • 2

n=123の場合 sum関数は


( n / 10 ) + ( n % 10 )
= ( 123 / 10 ) + ( 123 % 10 )
= ( 12 ) + ( 3 )
= 15
となります

ということは 12となる n/10をもっと分解する必要があります
whileループや 再帰呼び出しなどで分解するようにしてみましょう
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報