1002 写出这个数 (20分)
1. 题目描述
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
作者: CHEN, Yue
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB
2. 解决方案
分两步:求各位数和、输出拼音。求和最明显的思路是,接收输入,逐位求余求和。这个思路在这道题行不通,因为输入的最大数是10100-1,远超C语言所能存储的最大整数。更好的办法是,逐位输入,直接求和。接下来输出拼英,只需要一个switch case结构逐位输出即可,注意每个位之间有空格,最后一位后面没有空格。
// C语言方案
#include <stdio.h>
#include <math.h>
void solve(int, int);
int main(){
char ch;
int sum = 0, n = 0, count;
while((ch = getchar()) != '\n'){
sum += (ch - '0');
}
count = sum;
while(count != 0){
count/=10;
n++;
}
solve(sum,n);
return 0;
}
void solve(int sum, int n){
int digit;
while((n--) != 0){
digit = sum / pow(10,n);
switch(digit){
case 0: printf("ling"); break;
case 1: printf("yi"); break;
case 2: printf("er"); break;
case 3: printf("san"); break;
case 4: printf("si"); break;
case 5: printf("wu"); break;
case 6: printf("liu"); break;
case 7: printf("qi"); break;
case 8: printf("ba"); break;
case 9: printf("jiu"); break;
default: printf("error\n"); break;
}
sum -= (digit * pow(10,n));
if(n != 0) printf(" ");
}
}