题目地址:PAT乙1002.写出这个数(20)
题目描述:
读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。
输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。
求解过程:
通过自定义一个转换函数transfer来达到数字变拼音的效果,然后对个位数字求和,通过判断最终和的位数来分别输出结果。
程序:
#include <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std;
string transfer(int x)
{ /* 把数字转换为拼音 */
switch(x)
{
case 0: return "ling";
case 1: return "yi";
case 2: return "er";
case 3: return "san";
case 4: return "si";
case 5: return "wu";
case 6: return "liu";
case 7: return "qi";
case 8: return "ba";
case 9: return "shi";
default: break;
}
}
int main()
{
char ch[101];
gets(ch);
int sum = 0;
int ge, shi, bai; // 100位数最大和为999,所以就三位
string g, s, b;
for (int i = 0; *(ch+i) != '\0'; ++i)
{ /* 遍历数组,数字0的ASCII码为48 */
sum += *(ch+i)-48; /* 减去48就是对应的数字 */
}
ge = sum%10;
g = transfer(ge);
if (sum >= 100)
{ /* 如果sum大于100, 说明是三位数 */
bai = sum / 100;
shi = (sum%100) / 10;
b = transfer(bai);
s = transfer(shi);
printf("%s %s %s\n", &b,&s,&g);
}
else if (sum < 100 && sum > 10)
{ /* 如果是两位数 */
shi = (sum%100) / 10;
s = transfer(shi);
printf("%s %s\n", &s,&g);
}
else
printf("%s\n", &g);
return 0;
}