C++ 写出这个数

Posted apprendre

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 写出这个数相关的知识,希望对你有一定的参考价值。

题目如下:

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

输入格式:

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

输出格式:

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

输入样例:

                                                                             1234567890987654321123456789
 

输出样例:

                                                                                       yi san wu
一开始我还没意识到10的100次方是个什么概念,然后去搜了一下:世界上所有的沙漠的沙子数目约等于10^100
所以用int、double、long类型去接收是不可能的。只能用char类型或者string,这里用string类型(记得include<string>)
1    string nums;
2     cin >> nums;
3     for(int i = 0;i < nums.size();++i)
4     {
5         int num = nums[i] - 0;
6         sum += num;
7     }

这是main函数中接收输入的代码,这时已经能得到输入的数据的各位之和了,我不想在main函数中写过多代码,所以接下来的判断这个sum是几位数的工作就交给另一个函数

在这个函数中要判断这个sum是几位数,再对应的去输出这个数对应的拼音。

 1 void fun(int sum)
 2 {
 3     vector<int> sums;
 4     int a,b,c,d,e;
 5     if(sum/10000 >= 1)
 6     {//超过5位数 包括5位数
 7         e = sum/10000;
 8         d = (sum-e*10000)/1000;
 9         c = (sum-e*10000-d*1000)/100;
10         b = (sum-e*10000-d*1000-c*100)/10;
11         a = (sum-e*10000-d*1000-c*100 -b*10);
12         sums.push_back(e);
13         sums.push_back(d);
14         sums.push_back(c);
15         sums.push_back(b);
16         sums.push_back(a);
17     }else if(sum/1000 >= 1)
18     {//4位数
19         d = sum/1000;
20         c = (sum-d*1000)/100;
21         b = (sum-d*1000-c*100)/10;
22         a = (sum-d*1000-c*100 -b*10);
23         sums.push_back(d);
24         sums.push_back(c);
25         sums.push_back(b);
26         sums.push_back(a);
27     }else if(sum/100 >= 1)
28     {//3位数
29         c = sum/100;
30         b = (sum-c*100)/10;
31         a = (sum-c*100 -b*10);
32         sums.push_back(c);
33         sums.push_back(b);
34         sums.push_back(a);
35     }else if(sum/10 >= 1)
36     {//2位数
37         b = sum/10;
38         a = (sum-b*10);
39         sums.push_back(b);
40         sums.push_back(a);
41     }else
42     {//1位数
43         a = sum;
44         sums.push_back(a);
45     }
46 }

这里重用了我之前的一段代码,这一大串看着非常多,其实一旦确定是几位数后就只执行if中的,所以时间不会很长。(但是代码冗余很多)

判断sum的位数以后,再用一个switch语句来输出即可。

 1     for(vector<int>::iterator it = sums.begin();it != sums.end();it++)
 2     {
 3         switch(*it)
 4         {
 5             case 1:cout << "yi" ; break;
 6             case 2:cout << "er" ; break;
 7             case 3:cout << "san" ; break;
 8             case 4:cout << "si" ; break;
 9             case 5:cout << "wu" ; break;
10             case 6:cout << "liu" ; break;
11             case 7:cout << "qi" ; break;
12             case 8:cout << "ba" ; break;
13             case 9:cout << "jiu" ; break;
14             case 0:cout << "ling" ; break;
15          }
16         if(it != sums.end()-1)
17         {
18             cout << " ";
19         }

最后在main函数中调用这个方法即可。

完整代码如下:

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 using namespace std;
 5 
 6 void fun(int sum)
 7 {
 8     vector<int> sums;
 9     int a,b,c,d,e;
10     if(sum/10000 >= 1)
11     {//超过5位数 包括5位数
12         e = sum/10000;
13         d = (sum-e*10000)/1000;
14         c = (sum-e*10000-d*1000)/100;
15         b = (sum-e*10000-d*1000-c*100)/10;
16         a = (sum-e*10000-d*1000-c*100 -b*10);
17         sums.push_back(e);
18         sums.push_back(d);
19         sums.push_back(c);
20         sums.push_back(b);
21         sums.push_back(a);
22     }else if(sum/1000 >= 1)
23     {//4位数
24         d = sum/1000;
25         c = (sum-d*1000)/100;
26         b = (sum-d*1000-c*100)/10;
27         a = (sum-d*1000-c*100 -b*10);
28         sums.push_back(d);
29         sums.push_back(c);
30         sums.push_back(b);
31         sums.push_back(a);
32     }else if(sum/100 >= 1)
33     {//3位数
34         c = sum/100;
35         b = (sum-c*100)/10;
36         a = (sum-c*100 -b*10);
37         sums.push_back(c);
38         sums.push_back(b);
39         sums.push_back(a);
40     }else if(sum/10 >= 1)
41     {//2位数
42         b = sum/10;
43         a = (sum-b*10);
44         sums.push_back(b);
45         sums.push_back(a);
46     }else
47     {//1位数
48         a = sum;
49         sums.push_back(a);
50     }
51     for(vector<int>::iterator it = sums.begin();it != sums.end();it++)
52     {
53         switch(*it)
54         {
55             case 1:cout << "yi" ; break;
56             case 2:cout << "er" ; break;
57             case 3:cout << "san" ; break;
58             case 4:cout << "si" ; break;
59             case 5:cout << "wu" ; break;
60             case 6:cout << "liu" ; break;
61             case 7:cout << "qi" ; break;
62             case 8:cout << "ba" ; break;
63             case 9:cout << "jiu" ; break;
64             case 0:cout << "ling" ; break;
65          }
66         if(it != sums.end()-1)
67         {
68             cout << " ";
69         }
70     }
71 }
72 
73 
74 int main()
75 {
76     int sum = 0;
77     string nums;
78     cin >> nums;
79     for(int i = 0;i < nums.size();++i)
80     {
81         int num = nums[i] - 0;
82         sum += num;
83     }
84     fun(sum);
85     return 0;
86 }
 

以上是关于C++ 写出这个数的主要内容,如果未能解决你的问题,请参考以下文章

1002 写出这个数 (20分)

PTA PAT乙级真题,95题(C++,AC代码)

C++ 代码片段执行

此 Canon SDK C++ 代码片段的等效 C# 代码是啥?

1002 写出这个数(乙级)

1002.写出这个数