题目
题目描述
给定一个非负整数 NN,你的任务是计算 NN 的所有数字的总和,并以英语输出总和的每个数字。
输入格式
共一行,包含一个整数 NN,整数 NN 可能会出现前导0,比如:00123,对应的整数是123。
输出格式
共一行,用英语输出总和的每个数字,单词之间用空格隔开。
样例
输入数据 1
12345
输出数据 1
one five
数据范围
0 ≤ N≤ 10^100
题目分析
首先看到题目范围的n为0 ≤ N≤ 10^100,可以知道不管是int还是long long 都装不下这么大的数,所以考虑用到string类型存储,因为string 可以看成是char类型数组,从而对每一位数字拆分。
接下来的问题就是如何从每一个char类型的数字转为int,这里我想到的方法是拿该字符-‘0’再转为int类型,可以写一个转换函数。
int ct(char x){
return x-'0';
}
3在将字符转为数字后,设置一个res累加,得到每个数字的和。
4对res进行取模,每次得到的都是res的最后一位,与switch-case中的值进行比对,从而输出。
再比对完后进入判断,如果res/10==0则结束循环,否则就要自除10,从而获得下一位数字。
5将switch-case得到的值放入vector中,该可变数组的类型为string
6进行vector数组的倒序输出。
代码分析
#include<bits/stdc++.h>
using namespace std;
vector<string>a;
int ct(char x){
return x-'0';//设置转换函数
}
int main(){
string n;
int res=0;
cin>>n;
for(int i=0;i<n.size();i++){
// cout<<ct(n[i])<<endl;
res += ct(n[i]); //进行累加
}
while(1){
int c=res%10;//获得最后一位数字
switch(c)//判断最后一位数字
{
case 0:
a.push_back("zero");
break;
case 1:
a.push_back("one");
break;
case 2:
a.push_back("two");
break;
case 3:
a.push_back("three");
break;
case 4:
a.push_back("four");
break;
case 5:
a.push_back("five");
break;
case 6:
a.push_back("six");
break;
case 7:
a.push_back("seven");
break;
case 8:
a.push_back("eight");
break;
case 9:
a.push_back("nine");
break;
}
if(res/10==0){
break;
}
else{
res/=10;
}
}
for(int i=a.size()-1;i>=0;i--){
cout<<a[i]<<" ";//倒序输出
}
return 0;
}