/* 1002. 写出这个数 (20) 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10^100。 输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。 输入样例: 1234567890987654321123456789 输出样例: yi san wu */ /* 思路: 1.字符串存储长达100位的"数字",解决空间放不下问题; 2.对各位数字累加求和,注意char转int,ASCII表中48:'0';65:'A';97:'a' 3.输出时,对最后一个数字拼音字符串的多余空格,可以用比较巧妙的办法解决:字符串数组的该位置为' '; 4.运用好头文件<string.h>中常用的【字符串数组】的处理函数: strcpy(字符串数组1,字符串数组2); strncpy(字符串数组1,字符串数组2, len); strcmp(字符串数组1,字符串数组2);//0:相等;1:字符串数组1>字符串数组2;-1:字符串数组1<字符串数组2; strncmp(字符串数组1,字符串2, len); strcat((字符串数组1,字符串2)); strupr(字符串数组数组);//转大写 strlwr(字符串数组);//转小写 strlen(字符串数组);//求字符串长度 */ #include <iostream> #include <string.h> using namespace std; const int MAX_LENGTH = 100; char str[1000]; int calculate(char chs[], int len){ int num = 0; for(int i=0;i<len;i++){ num += ((int)chs[i]) - 48; } return num; } void print(int x){ static int tmp; static char pinyin[1000]; for(;x != 0;){ tmp = x%10; x /= 10; switch(tmp){ case 1: strcpy(pinyin, "yi ");break; case 2: strcpy(pinyin, "er ");break; case 3: strcpy(pinyin, "san ");break; case 4: strcpy(pinyin, "si ");break; case 5: strcpy(pinyin, "wu ");break; case 6: strcpy(pinyin, "liu ");break; case 7: strcpy(pinyin, "qi ");break; case 8: strcpy(pinyin, "ba ");break; case 9: strcpy(pinyin, "jiu ");break; case 0: strcpy(pinyin, "ling ");break; } strcat(pinyin, str); strcpy(str, pinyin); } } int main(){ char number_str[MAX_LENGTH]; int position; char tmp; for(position=0;position<MAX_LENGTH;){ scanf("%c", &tmp); if(tmp != ' '){ number_str[position++] = tmp; } else break; } print(calculate(number_str, position)); str[strlen(str) - 1] = ' ';//经典:删除末尾空格 printf("%s", str); }