L1-007 念数字
题目详情:
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234
。
提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si
。
输入样例:
-600
输出样例:
fu liu ling ling
解题思路:
对于读入的整数,分成0和非零数进行初步处理,如果为0,直接输出ling后,后续用flag进行判断该数是否为零。
非零数又分成正数和负数,对于负数,在输出fu后,将其乘以-1,即后续将其视作正数来进行处理。
输出整数每一位数字对应的拼音,即首先需要知道每一位数字为多少,一个整数需要分离数字,很容易想到可以用%10来得到。
一个整数,每次对其%10,得到的该整数的末位数字。可以定义一个数组,将每次得到的末位数字放在该数组中,从数组的最后逐一往前放。
分离数字与数组赋值完成后,最后运用for循环对数组的每一位数字, 即对原整数的每一位数字进行switch分支判断,输出每一位数字对应的拼音
初步代码:
#include<stdio.h>
int main()
{
int number,i,a,flag=0,count=0,k;
scanf("%d",&number);
if (number==0) {
printf("ling");
flag++;
}else if (number<0) {
printf("fu ");
number=-1*number;
}
a=number;
if (flag==0) {
while (a!=0) {
a/=10;
count++;
} //count的值为该整数有几位数
k=count;
int b[count];
while (number!=0) {
b[k-1]=number%10; //分离数字 放置在数组b中
number/=10;
k--;
}
for (i=0;i<count;i++) {
switch(b[i]) {
case 0:
printf("ling");
if (i!=count-1) {
printf(" ");
}
break;
case 1:
printf("yi");
if (i!=count-1) {
printf(" ");
}
break;
case 2:
printf("er");
if (i!=count-1) {
printf(" ");
}
break;
case 3:
printf("san");
if (i!=count-1) {
printf(" ");
}
break;
case 4:
printf("si");
if (i!=count-1) {
printf(" ");
}
break;
case 5:
printf("wu");
if (i!=count-1) {
printf(" ");
}
break;
case 6:
printf("liu");
if (i!=count-1) {
printf(" ");
}
break;
case 7:
printf("qi");
if (i!=count-1) {
printf(" ");
}
break;
case 8:
printf("ba");
if (i!=count-1) {
printf(" ");
}
break;
case 9:
printf("jiu");
if (i!=count-1) {
printf(" ");
}
break;
}
}
}
return 0;
}
之后发现switch分支里
if (i!=count-1) {
printf(" ");
}
这一部分判断输出空格的代码多次重复,其实这一重复是没有必要的,该if循环不用放在switch分支的每个循环中,只需要放在for循环中即可。
简化后代码:
#include<stdio.h>
int main()
{
int number,i,a,flag=0,count=0,k;
scanf("%d",&number);
if (number==0) {
printf("ling");
flag++;
}else if (number<0) {
printf("fu ");
number=-1*number;
}
a=number;
if (flag==0) {
while (a!=0) {
a/=10;
count++;
} //count的值为该整数有几位数
k=count;
int b[count];
while (number!=0) {
b[k-1]=number%10;
number/=10;
k--;
}
for (i=0;i<count;i++) {
switch(b[i]) {
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:
break;
}
if (i!=count-1) {
printf(" ");
}
}
}
return 0;
}
参考学习思路:
虽然对重复的代码进行了一些简化,但整体的解题思路还是相对比较复杂,所以参考了网上的一些方法。
可以将读入整数视作为读入字符串,对于字符串数组的每一个字符,进行分支循环判断输出,思路较为简单。不用事先另外处理整数为0和负数符号,也不用另外写个循环求整数是几位数。
参考出处:https://blog.csdn.net/weixin_43710740/article/details/84956547
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int i,len;
char num[100];
gets(num); //读入数字字符串
len=strlen(num); //得到字符数组的长度,用于后续的for循环
for (i=0;i<len;i++) {
switch(num[i]) {
case '-':
printf("fu");break;
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:
break;
}
if (i!=len-1) {
printf(" ");
}
}
return 0;
}