写出来吧问题详解-编程练习题(100)

目录

问题:

分析:

C++代码:

总结:


问题:

4.

【问题描述】

读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

【输入形式】

每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10的100次方。

【输出形式】

在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。

【样例输入】

1234567890987654321123456789

【样例输出】

yi san wu

【样例说明】
友情提示汉语拼音

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各位数字,然后依次输出对应汉语拼音,但是这样的话我们申请数组空间时不容易设定,太小了可能不够存储,太大了浪费内存。

原文地址:https://www.cnblogs.com/www-helloworld-com/p/10202960.html