PAT乙級1002. 寫出這個數 C++
阿新 • • 發佈:2019-02-09
本人沒有什麼特殊的簡單的解題技巧,為了安全,此次用了C++的字串,從n
小於10的100次方可以看出n肯定不是long之類的,應該是字串。主要就是對int和string之間的轉換,以及輸出了。我的程式碼如下,個人感覺應該不是最優的,但是基本能講清:
#include <iostream>
#include <string>
using namespace std;
void static readNumber(char char_number);
int main()
{
string input;//輸入的數字
cin>>input;
unsigned int sum=0;//和
//求和
for(unsigned int i=0;i<input.length();i++)
{
sum+=(unsigned int)input[i]-48;
}
//裝入倒序的結果字串
string number_sum="";
while(1)
{
number_sum+=(char)(sum%10+48);
sum/=10;
if(sum/10==0)//當這個運算進行到還剩最後一位的時候,也有可能是隻有一位,並且還是零
{
if (sum%10!=0)//從這裡,我們考慮是零的邊界情況,只有這一位不是零的時候才裝入
{
number_sum+=(char)(sum%10+48);
}
break;
}
}
//變為正序字串,裝入結果集
string result="";
for(int i=number_sum.length()-1;i>=0;i--)
{
result+=number_sum[i];
}
//輸出結果
for(int i=0;i<result.length();i++)
{
readNumber(result[i]);
if (i!=result.length()-1)//當且僅當遍歷輸出的數字不是最後一個的時候才打印空格
{
cout<<" ";
}else
{
}
}
system("pause");
return 0;
}
void static readNumber(char char_number)
{
switch((int)char_number-48)
{
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;
}
}
最後,談一點我的感想吧。string這個類還是很神奇的,其實本題中沒有顯現出這個東西的優越性,用char陣列一樣可以解決。當然,對於“逆序”這件事兒,方法還是很多的,我們可能首先就想到棧這個東西,逆序其實有時候還會用到雙向佇列,等等吧。祝願大家程式設計愉快~沒有bug~