题目:
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
最终代码:
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
void trans(int n){
switch (n){
case 0: cout<<"ling";
break;
case 1: cout<<"yi";
break;
case 2: cout<<"er";
break;
case 3: cout<<"san";
break;
case 4: cout<<"si";
break;
case 5: cout<<"wu";
break;
case 6: cout<<"liu";
break;
case 7: cout<<"qi";
break;
case 8: cout<<"ba";
break;
case 9: cout<<"jiu";
break;
default: cout<<"error!";
}
}
int main(){
char num[100];
cin>>num;
int len=strlen(num); //数字长度
int sum=0; //数字之和
//cout<<len;
for(int i=0;i<len;i++)
{
sum=sum+num[i]-'0'; //ASCII码减法,把字符改为数字
}
int high,time;
int out=0;
//cout<<sum;
//读取每一位
high=(int)(log10(sum))+1; //需要除10次数
while (high>1){ //从最高位开始
time = pow(10,high);
out=sum%time; //当前位
time = pow(10,high-1); //除去后面的0
out=out/time; //改成个位数字,方便读
trans(out); //拼音输出
cout<<" ";
high--;
}
out=sum%10;
trans(out);
}
代码0:只能较小数字
#include<iostream>
#include<cmath>
#include<stack>>
using namespace std;
void trans(int n){
switch (n){
case 0: cout<<"ling";
break;
case 1: cout<<"yi";
break;
case 2: cout<<"er";
break;
case 3: cout<<"san";
break;
case 4: cout<<"si";
break;
case 5: cout<<"wu";
break;
case 6: cout<<"liu";
break;
case 7: cout<<"qi";
break;
case 8: cout<<"ba";
break;
case 9: cout<<"jiu";
break;
default: cout<<"error!";
}
}
int main(){
unsigned long long num;
int sum=0;
cin>>num;
//cout<<num<<endl;
while(num>0){
sum+=num%10; //从个位开始,一位位往前读各位数字,求和
num=num/10;
}
// cout<<sum<<endl;
int high,time;
int out=0;
high=(int)(log10(sum))+1;
while (high>1){
time = pow(10,high);
out=sum%time;
time = pow(10,high-1);
out=out/time;
trans(out);
cout<<" ";
high--;
}
out=sum%10;
trans(out);
}
代码0存在问题:
数字过长int甚至unsigned long long保存不下,导致结果不对。短数字正确,大数字出错。
改进后方法:用char 数组或堆栈保存
优点:不用计算数字长度,直接strlen。