今日份第二题,这道题相比前一道难度有了一定的提升,在思考问题时,可以将问题化简成若干个小问题。
问题介绍
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100 。
输入样例
1234567890987654321123456789
输出样例
yi san wu
问题分析
问题可以分解成以下几个部分:
①对输入数据的每一位进行求和
具体实现又包括:
1.用字符数组存储数字,由于整型数的范围达不到100位;
2.将每一位的字符通过ASCII码值转换为整型,在此需要熟记0的ASCII码值为48,A的ASCII码值为65,a的ASCII码值为97
3.使用循环,将转换得到的每位整数求和
②按顺序以拼音形式输出整数和的各位数字
我这里采取的思路是
1.求出整数和的位数,通过while循环实现,将位数bit初始化为0,令等于数字和的数不断除以10,每次迭代bit++,当他为0时,退出循环,即可得到整数和的位数
2.使用for循环,按顺序求出整数和的每位数字,这里是通过除以10的(bit-1)次方,每次迭代bit-1,当bit=0时退出循环
3.在循环体里嵌套switch语句,依据每一位的数字,输出对应的拼音即可。
程序源码
#include <iostream>
#include <cmath>
using namespace std;
void output(int n); //以拼音形式输出整数n
int main(void)
{
char x[101]; //由于输入值可能有100位,故开辟空间为101
int n = 0, t, i = 0; //i为每一位的索引,t为每一位的数值,n为各位数字之和
cin>>x;
//求各位数字之和
while(x[i] != '\0')
{
t = x[i]-48; //将字符型转换为整数型
n += t;
i++;
}
output(n); //以拼音形式输出整数n
return 0;
}
void output(int n)
{
int t, bit = 0, temp=n;
//求整数n的位数
while(temp != 0)
{
temp /= 10;
bit++;
}
while(1) //循环按顺序计算整数n的每一位数字
{
temp = pow(10, bit-1);
t = n/temp;
n = n%temp;
bit--;
switch(t) //输出每一位整数对应的拼音
{
case 1:
cout<<"yi";
break;
case 2:
cout<<"er";
break;
case 3:
cout<<"san";
break;
case 4:
cout<<"si";
break;
case 5:
cout<<"wu";
break;
case 6:
cout<<"liu";
break;
case 7:
cout<<"qi";
break;
case 8:
cout<<"ba";
break;
case 9:
cout<<"jiu";
break;
case 0:
cout<<"ling";
break;
}
if(bit != 0) //当不是最后一位时输出空格,否则退出循环
cout<<" ";
else
break;
}
}