目录
问题:
4. |
【问题描述】 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 【输入形式】 每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10的100次方。 【输出形式】 在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。 【样例输入】
【样例输出】
【样例说明】 0~9:ling yi er san si wu liu qi ba jiu shi |
分析:
首先乍一看,题目好简单,但是里边的考点只要有1)对大数字的处理,本题只涉及对大数值的存储,但是如果让算两个大数值的加减乘除呢?该怎么做。最笨的方法就是使用字符串或者数组存储大数值,然后从低位数到高位数计算,就像小学列式子计算一样。2)对字符串的操作。大数值存入字符串之后需要进行处理。3)对整数操作的考察,比如操作每位的数字,这是很基本也很有趣的操作。
C++AC代码:
#include <iostream>
using namespace std;
int getLength(int a);
int main()
{
string str;
string number[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"}; //从0-9的汉语拼音
int sum = 0; //存储各位数字之和的变量
int temp; //计算过程中的中间变量
int len_sum = 0; //存储sum变量的长度
int power = 1; //存储10的n次方
cin >>str; //读入数据,有可能是一个超出int型能存储的数值。所以用str字符串来存储。
for(int i=0; i<str.size(); i++) //计算各位数字之和存入sum
{
sum += str[i]-'0';
}
len_sum = getLength(sum); //计算sum的长度
for(int j =1; j<len_sum; j++) //输出sum各位数字对应的汉语拼音
{
power = 1;
for(int k=j; k<len_sum; k++)power *=10; //计算10的len_sum-1次方
temp = sum/power; //计算sum各个位的数字
sum = sum%power; //取余,计算下一位
cout << number[temp] <<' '; //输出对应的汉语拼音
}
cout << number[sum] << endl;
return 0;
}
int getLength(int a) //求int型数字的长度的函数
{
int len =0; //存储变量a的长度。
while(a)
{
a=a/10;
len ++;
}
return len;
}
总结:
在做本题的时候对C++String类的操作不太熟悉,浪费了很多时间。在使用math.h函数库中double pow()函数时出现了点问题,计算pow(10,2)——10的2次方,时得到的结果是99,究其原因,pow()函数返回的是double类型的值,在强转为int型时可能向下求整了,导致取值99,程序最后结果也不对。后来只能自己写个循环来求10的len_sum-1次方。也有可能是pow()函数在计算时只能算能被2^n(n=0、1、2......)的数值。
我使用的方法是求出sum(大数值各位数字之和)的长度之后再处理输出sum各位数字对应的汉语拼音,也可以使用一个数组存储sum各位数字,然后依次输出对应汉语拼音,但是这样的话我们申请数组空间时不容易设定,太小了可能不够存储,太大了浪费内存。