题目内容:
你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。
如输入1234,则输出:
yi er san si
注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:
fu er san si yi
输入格式:
一个整数,范围是[-100000,100000]。
输出格式:
表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。
输入样例:
-30
输出样例:
fu san ling
时间限制:500ms内存限制:32000kb
分析:本题与那道“正序分解整数题型”考查的思路一样,运用的知识点也相同,只不过这次是输出方式变为拼音。这里要借助switch 语句,因为所用的数字都是0~9之间,所以用10个case分支分别表示每一位数字对应的拼音;然后根据读到的每一位数字自动选择要输出的拼音。此外,本题还涉及对于负数的处理,由于负数会对取出每一位数字(涉及取模取余运算)有影响,所以应该单独处理;在程序读取整数之前首先判断正负,若为负数,则首先输出“fu+空格”,然后把该负整数转换为正整数,继续后面运算。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int x = 0;
int t = 0;//t用来暂存x的数值,因为如果用x参与运算,出了while循环会变为0,对后续读取每一位数字有影响
int mask = 1;//mask用于每次模除的被除数,最后所得的值即为从高位到低依次取出的数字
scanf("%d", &x);
t = x;
if (x<0)
{
t = -x;
printf("fu ");
x = -x;
}
while (t > 9)
{
t /= 10;
mask *= 10;
}
//printf("mask=%d,x=%d\n", mask,x);
do
{
int d = x / mask;//d表示每次取出的数字
switch(d)
{
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;
}
if (mask > 9)
{
printf(" ");
}
x %= mask;
mask /= 10;
} while (mask > 0);
return 0;
}