題目:
讀入一個正整數 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。