L1-007 念数字(C语言)

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;
}
  • 18
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄JY_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值