读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。
输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:1234567890987654321123456789输出样例:
yi san wu
思路:首先输入的自然数小于十的一百次方,所以不能用整形变量、浮点型变量存储,只能用字符串储存。其次对每一个字符进行判断求和,由于字符编码时0-9并不一定相连,所以用switch语句解决。接着,建立一个一维字符指针数组,在该数字的位置存储对应数字的拼音字符串的地址。最后根据和的每一位数字直接利用前面的一维字符指针数组输出拼音。
如果要在PAT上运行,只要把下列代码中的scanf_s("%s", n, MAX);改成scanf("%s",n);即可。
代码(VS 2015):
#include<stdio.h>
#define MAX 200
int main(void) {
char n[MAX];
int temp = 0, sum = 0, count = 0, sum_temp = 0;
int val[10];
char* name[] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
scanf_s("%s", n, MAX);
for (; n[temp] != '\0'; temp++) {
switch (n[temp]) {
case '0': break;
case '1': sum += 1; break;
case '2': sum += 2; break;
case '3': sum += 3; break;
case '4': sum += 4; break;
case '5': sum += 5; break;
case '6': sum += 6; break;
case '7': sum += 7; break;
case '8': sum += 8; break;
case '9': sum += 9; break;
default: break;
}
}
sum_temp = sum;
if (sum_temp == 0) {
printf("ling");
}
else {
while (sum_temp) {
val[count++] = sum_temp % 10;
sum_temp /= 10;
}
while (count--) {
printf("%s", name[val[count]]);
if (count > 0)
putchar(' ');
}
}
return 0;
}