题意:
给你一个非负数N(N<=10^100),你需要计算每一位的位数之和,并将结果的每一位用英文输出。(例如输入为“191”,每一位数字之和为1+9+1=11,输出为“one one”)。
思路:
由于输入可能会很大,远超long long 范围,所以我使用字符串来模拟这个数。我们可以通过遍历字符串来得到输入数的每一位数字之和,最后用英文单词输出结果的每一位即可。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3;
const int N=5e2+10;
map<int,string>m;
stack<string>st;
void solve(){
/*
* 使用map储存每个数对应的英文单词
*/
m[0]="zero";
m[1]="one";
m[2]="two";
m[3]="three";
m[4]="four";
m[5]="five";
m[6]="six";
m[7]="seven";
m[8]="eight";
m[9]="nine";
string s;
cin>>s;
int sum=0;
for(int i=0;i<s.length();i++){
//数字字符减去'0'即可得到对应的整型数
sum+=(s[i]-'0');
}
//结果可能等于0,需要进行特判
if(sum==0){
cout<<"zero";
return;
}
//对每一位数进行求和
while(sum){
st.push(m[sum%10]);
sum/=10;
}
//因为需要从高位向低位输出,
//而前面是从低位向高位处理,
//因此使用栈这种后进先出的数据结构
while(!st.empty()){
cout<<st.top();
if(st.size()>1)
cout<<" ";
st.pop();
}
}
signed main(){
int t=1;
//cin>>t;
while(t--){
solve();
}
}