PAT B級1002はこの数(20点)を書きます


タイトル
正の整数nを読み込み、その各数字の和を計算し、中国語のピンインで和の各数字を書きます.入力フォーマット:各テスト入力には、自然数nの値を与える1つのテスト例が含まれます.ここではnが10100未満であることを保証する.出力フォーマット:1行にnの各数字の和の各ビットを出力し、ピンイン数字の間に1スペースがあるが、1行の最後のピンイン数字の後にスペースがない.入力サンプル:1234567890987654321123456789出力サンプル:yi san wu
ソースプログラム(C++)
この問題は解析から分かるように,まずnビット毎の数字の和sumを求めることであり,nの上限が極めて大きいためint,longなどで直接格納することはできず,nを文字配列(文字列)として処理する必要がある.また我々の目的はsumを求めるだけであり,nの具体的な値とは何の関係もないので,nの各ビットを1つの配列を単独で定義して格納する必要はなく,getchar()関数によって1つずつ読み取り,蓄積し,破棄するだけでよい.s’-'0’はsの数値である.
タイトルから分かるn<10100は、n<10の場合nが1桁、n<102の場合nが2桁……なので、n<10100の場合nが最大100桁、最大999……9(100個9)、そのsumが900なので、sum毎の数字を格納する配列長が3であれば十分、コード中の#define max 3およびint d[max]である.
定数2次元文字配列(文字列配列)pinyinを定義し、0~9のピンインを順次格納することで、配列の下付き文字が数値やピンインにぴったり対応し、非常に便利です.
//1002      (20 )
//Yuanxing Xu
#include 
#define max 3
using namespace std;
const char* pinyin[] = {
     "ling","yi","er","san","si","wu","liu","qi","ba","jiu"};

int main() {
     
	char c;
	int sum=0;
	while((c=getchar())!='
'
) sum += c-'0'; //cout< int i,d[max]; for(i=0;i<max&&sum!=0;i++){ d[i]=sum%10; sum/=10; } i--; for(;i>=0;i--){ if(i==0) cout<<pinyin[d[i]]<<endl; else cout<<pinyin[d[i]]<<" "; } return 0; }

ソースプログラム(C)
//1002      (20 )
//Yuanxing Xu
#include 
#define max 3
const char* pinyin[] = {
     "ling","yi","er","san","si","wu","liu","qi","ba","jiu"};

int main() {
     
	char c;
	int sum=0;
	while((c=getchar())!='
'
) sum += c-'0'; //printf("%d
",sum);
int i,d[max]; for(i=0;i<max&&sum!=0;i++){ d[i]=sum%10; sum/=10; } i--; for(;i>=0;i--){ if(i==0) printf("%s
"
,pinyin[d[i]]); else printf("%s ",pinyin[d[i]]); } return 0; }