一つの正整数を引数として受け取り、
その整数の各桁の和を返す関数を作成する。
この関数を用い、いくつかの正整数を入力して
その整数の各桁の和を表示する。
入力の終わりは、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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
【C言語】円の面積を求めるプロ...
-
ラップ関数とはどんなものですか?
-
シグマ公式・・・C言語
-
C言語でシグマで総和を求める関...
-
C言語でlookupのような関数って?
-
【C++】関数ポインタの使い方
-
std::set<int> で、ある値が何...
-
式は定数値が必要です」という...
-
フィボナッチ数列
-
int型の変数値をバイト列として...
-
課題でつまってます・・・
-
ポインタの型変換、どうやるん...
-
入力を待たずにstdinの監視をし...
-
因数分解を行うプログラムについて
-
C言語で、一桁の整数4つを、四...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
c言語の配列を使ってサイコロを...
-
【C++】関数ポインタの使い方
-
(マルチスレッド)_beginthrea...
-
「{ } で囲むだけ」は正しい?
-
if と配列の組み合わせ
-
C言語でlookupのような関数って?
-
数字列を3桁ごとにカンマで区切...
-
課題でつまってます・・・
-
read関数をノンブロッキングで...
-
実数の整数部,小数部の取得
-
system関数がうまくいかない
-
商と剰余を同時に求める(C言語)
-
std::set<int> で、ある値が何...
おすすめ情報