题目要求
题目的意思显而易见,就是把输入的数字的每一位上的数字加起来,再将得到的这个“求和数”用拼音yi,er,san……表示出来
将数字转成拼音的两种函数:
函数一:
char* transform(int num) {
char* name = (char*)malloc(5 * sizeof(char));
switch (num)
{
case 0:strcpy(name, "ling"); break;
case 1:strcpy(name, "yi"); break;
case 2:strcpy(name, "er"); break;
case 3:strcpy(name, "san"); break;
case 4:strcpy(name, "si"); break;
case 5:strcpy(name, "wu"); break;
case 6:strcpy(name, "liu"); break;
case 7:strcpy(name, "qi"); break;
case 8:strcpy(name, "ba"); break;
case 9:strcpy(name, "jiu"); break;
}
return name;
}
起初是先算出“求和数”,再将“求和数”做求余、整除,再通过此函数得到字符串,将字符串存入数组,再逆向输出。
方法二:
int transform(int num) {
switch (num)
{
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;
}
return 0;
}
直接输出拼音
第一种的函数耗费了我大量的时间来思考字符串的定义、拼接,甚至由于VS版本问题对于字符串的初始化都耗费了大量时间。
主体代码:
函数一对应的代码:
第一段:
int sum = 0;
int lenth = 0;
char str[101];
char* arr[3]={};
scanf("%s", &str);
for (int i = 0; i < strlen(str); i++) {
sum = sum + str[i] - '0';
}
核心代码就最后一句(称之为核心代码都有点抱一丝儿),这一句的 -'0' 能将字符转化为数字。
第二段:
sprintf(str, "%d", sum);//将“求和数”转为字符串
lenth = strlen(str);//求和字符串长度,以便锁定后续循环代码的界限
sum = atoi(str);//将字符串转化为整形,用以求余、整除,利用起第一种函数
for (int i = 0; i < strlen(str); i++) {
arr[i] = transform(sum % 10);//从个位开始得出拼音,存入字符串数组
sum = sum / 10;//整除,从个位开始,消除逐个位数
}
for (int k = lenth - 1; k > 0; k--) {//逆向输出拼音,从总长度-1的下标开始,下标为0不再带空格
printf("%s", arr[k]);
printf(" ");
}
printf("%s", arr[0]);//输出最后一位,不带空格
第二段自我感觉有点繁琐,肯定还可以优化,减少代码量,欢迎评论区讨论 !!!
函数二对应的代码:
第一段:(相同的配方,一样的味道!大卖特卖!)
int sum = 0;
int lenth = 0;
char str[101];
scanf("%s", &str);
for (int i = 0; i < strlen(str); i++) {
sum = sum + str[i] - '0';
}
第二段:
sprintf(str, "%d", sum);//将“求和数”转为字符串
lenth = strlen(str);//求和字符串长度,以便锁定后续循环代码的界限
sum = atoi(str);//将字符串转化为整形,用以求余、整除,利用起第一种函数
int num[3];//题目提到是10^100,也就是一百个0,总共101位,每一位都是9,求和之后也就只有909,总共三位
for (int i = 0; i < lenth; i++) {//循环求得每一位上的数字,存入num整形数组
num[i] = sum % 10;
sum = sum / 10;
}
for (int i = lenth-1; i > 0; i--) {//利用函数直接输出对应的拼音即可
transform(num[i]);
printf(" ");
}
transform(num[0]);
总结:
在这道题目中学到了,sprintf将整形转化为数组,atoi将字符串转化为整形,都是很便捷的。
①sprintf(XXX,XXX,XXX),共有三个参数。第一个对应字符串的存储对象,第二个对应即将转化为字符串的参数的类型(比如整形转为字符串就填"%d"),第三个对应即将被转化的参数
②atoi填一个参数即可。
atoi(str)