标签:board pac ack int lang push 另一个 pre ace
题目如下:
读入一个正整数 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 }
标签:board pac ack int lang push 另一个 pre ace
原文地址:https://www.cnblogs.com/apprendre-10-28/p/12702214.html