こんにちは! mnbd(@mnbbbbbd)です。
AIZU ONLINE JUDGEの「ITP1_8_B 数字の和」を解いてみましたので、その回答と解説をご紹介いたします。
プログラミング初心者なので、もっといい回答があるに違いありません。
あくまでも「動作はする」サンプルとしてご覧ください。
問題文
与えられた数の各桁の和を計算するプログラムを作成して下さい。
複数のデータセットが入力として与えられます。各データセットは1つの整数 x を含む1行で与えられます。
x は 1000 桁以下の整数です。
x が 0 のとき入力の終わりとします。このデータセットに対する出力を行ってはいけません。
各データセットに対して、x の各桁の和を1行に出力して下さい。
https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/8/ITP1_8_B
回答
#include <bits/stdc++.h>
using namespace std;
struct values {
char cs[1001];
};
int solved(char cs[]) {
int sum = 0;
for(int i = 0; cs[i] != '\0'; i++) {
sum += cs[i] - '0';
}
return sum;
}
int main() {
values vcs[1000];
values *vcsp = vcs;
while(true) {
cin >> vcsp->cs;
if(vcsp->cs[0] == '0') {
break;
}
vcsp++;
}
vcsp = vcs;
while(vcsp->cs[0] != '0') {
cout << solved(vcsp->cs) << endl;
vcsp++;
}
return 0;
}
解説
まず、文字列を引数として渡して、各桁の和の合計を返す関数を書いてます。
複数のデータセットで入力しなければならないので、一行分の文字列を含む構造体を作り、それを配列として確保しました。
後はその配列にデータセットを格納し、もう一度ループで構造体の各文字列を最初の関数に渡して出力しています。
ハマったポイント
データを格納する変数のデータ構造をどうするかで迷いました。
二次元配列でもいいのかもしれませんが、直感的に頭の中で理解しにくく感じて、構造体と配列を使いたいと思いました。
構造体やポインタの理解があやしいのであえてそちらで挑戦したところで、なかなか理解できずにハマりました。
具体的には、構造体とポインタが絡んだ場合のループの抜け方に苦しみました。
それとこの問題について、最初は数値として割り算や余りを使って各桁の合計を出すコードを書きましたが、long long型でも扱えないほど大きな数値がデータセットとして与えられるので通過できませんでした。
学んだこと
構造体やポインタをうまく活用するほうがプログラムとして見やすいことがある気がします。
ただ、このような小さなプログラムであえて構造体を使っていくことが正しいのかどうはわかりません。
配列や構造体が複雑になるとそのためのループや参照にバグが混入しやすくなることも感じました。
はじめにまず、データ構造を明確にすることが重要だと思いました。
まとめ
AIZU ONLINE JUDGEの「ITP1_8_B 数字の和」の回答と解説をご紹介いたしました。
私はまだ初心者ですが、よかったら一緒に勉強していきましょう。
Twitter@mnbbbbbdなどをフォローしていただければ幸いです。
以上です。
読んでいただきありがとうございました。