一つの正整数を引数として受け取り、
その整数の各桁の和を返す関数を作成する。
この関数を用い、いくつかの正整数を入力して
その整数の各桁の和を表示する。
入力の終わりは、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件)
- 最新から表示
- 回答順に表示
No.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;
}
No.4
- 回答日時:
>という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
No.3
- 回答日時:
不慣れなうちは自分がコンピュータになったつもりで、紙の上で試行錯誤してみましょう。
(今回のn/10のところの誤りもそうすればすぐに分かったはずです)
各桁の和を計算するためには各桁の数字を取り出さないとならないわけですが、ではどうすればいいのか?
一部おわかりのようですが、10進数で表された数は各桁ごとに1,10,100,1000...と10倍ずつになっているので、逆に割ってやれば各桁の数が取り出せます。
ただし割っただけだとその上の桁の数もついてきてしまいますから、欲しい桁だけにするために%10することが必要となります。
また、桁数としては1からintで表せる最大の値の桁数まであり得るわけですから、それについても考慮する必要があります。
ループ文について学んでいれば、それを使います。その場合は#2の回答のロジックになります。
No.2
- 回答日時:
123の場合:
各桁の和を0で初期化する
123を10で割り、商(12)とあまり(3)を求める。
あまり(3)を各桁の和に加える。
各桁の和は3になる。
12を10で割り、商(1)とあまり(2)を求める。
あまり(2)を各桁の和に加える。
各桁の和は5になる。
1を10で割り、商(0)とあまり(1)を求める。
あまり(1)を各桁の和に加える。
各桁の和は6になる。
これ以上続けても意味がないので、計算を終える。
最終結果は6となる。
以上のロジックをコード化してください。
No.1
- 回答日時:
n=123の場合 sum関数は
( n / 10 ) + ( n % 10 )
= ( 123 / 10 ) + ( 123 % 10 )
= ( 12 ) + ( 3 )
= 15
となります
ということは 12となる n/10をもっと分解する必要があります
whileループや 再帰呼び出しなどで分解するようにしてみましょう
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
std::set<int> で、ある値が何...
-
「指定されたキャストは有効で...
-
数字列を3桁ごとにカンマで区切...
-
比較回数と交換回数表示について
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
実数の整数部,小数部の取得
-
c言語
-
C言語
-
卒業研究でよく分からないとこ...
-
main関数以外での結果の表示?
-
各桁の和を返す関数
-
C言語での引数の省略方法
-
(int *)の意味
-
C++でvectorにテキストファイル...
-
if文について
-
プログラミング c言語
-
マルチスレッドでバグが発生します
-
【C++】関数ポインタの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報