前言:本期是关于pta题目念数字的详解,今天你c了吗?
题目:
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出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
代码实现:
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
char* p[] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
int n2 = n;
if (n < 0)
{
n = -n;
}
if (n == 0)
{
printf("ling");
}
int count = 0;
int n3 = n;
while (n3)
{
int a = n3 % 10;
count++;
n3 /= 10;
}
int arr[20] = { 0 };
int i = 0;
while (n)
{
arr[i++] = n % 10;
n /= 10;
}
if (n2 < 0)
{
printf("fu ");
}
for (i = count - 1; i >= 0; i--)
{
printf("%s", p[arr[i]]);
if (i != 0)
{
printf(" ");
}
}
return 0;
}
大致思路:
1. 数字0单独处理
2. 负数先变成它的相反数
在负数变成正数之前,要先把n的值(此时是负数)保存一份,用于后面的打印
3. 统计一个数字的位数
4. 将数字的每一位拆开,存入一个数组中
代码解读:
part 1
char *p[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
将读音(字符串)存入数组中,数组名是p,数组的每个元素类型是字符指针
part 2 特殊处理
if(n<0)
{
n=-n;
}
if(n==0)
{
printf("ling");
}
负数变成它的相反数(正数)
数字是0,单独打印,因为数字0不会进入while循环,从而不会存入一个数组中
part 3 统计位数
int count = 0;
int n3=n;
while(n3)
{
int a=n3%10;
count++;
n3/=10;
}
注意使用另一个和n的值相同的变量n3来进行while循环,因为在while循环内部 n3是会一直变小的
变量a只是用于暂时存放n3%10的值(即数字的每一位),无其他用处
part 3 存储数字的每一位
int arr[20]={0};
int i = 0;
while(n)
{
arr[i++]=n%10;
n/=10;
}
part 4 打印
if(n2<0)
{
printf("fu ");
}
for(i=count-1;i>=0;i--)
{
printf("%s",p[arr[i]]);
if(i!=0)
{
printf(" ");
}
}
注意:不能直接使用n,因为若n是负数,则n就在上面的代码中变成了正数
我们在负数变成正数之前,保存了n作为负数时的值,存储到n2中
逆序打印,将arr数组中存储的数字的每一位作为下标,打印p数组中的内容