原题链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805519074574336
思路
这题相对比较简单,就是逐个读入数字然后加起来,算出来的总和从最高位开始逐位用英文输出。需要注意的是,题中所给的数字是连在一起的,没有用空格隔开,而如果直接用cin会把一整串数字都读进去,这不是我们想要的。逐个字符读入需要用到的是cin.get()
方法。不过这样读进来的是char类型,如果用int输出相当于输出各个数字对应的ASCII码。我们需要将它转换成int类型,如果记得住数字对应的ASCII值比数字多48,就可以直接减48,如果记不住也可以用num = c - '0'
来转换,其中num是int类型,c是char类型。关于什么时候停止读取,网上给的是cin.get()) != EOF
,不过我试了一下,发现PAT的输入最后还有一位换行符,如果只有EOF来判断,那么最后还会读入换行符对应的ASCII值10。因此我们需要再加一个判断即(c = cin.get()) != EOF && c!=10
。
读入的同时进行累加运算,读完所有数字后就已经得到了它们的总和。题目中要求从最高位开始逐位用英文输出。先解决英文输出的问题,这个简单,写一个方法专门进行转换即可。如何从最高位开始输出,我目前没有想到直接从最高位开始输出的方法,但我知道怎么从最低位开始输出,只要每次取模10后的结果并且再将总和自身除以10即可。我可以把从最低位开始的每位数字存在vector中,之后倒序输出即可。代码如下:
代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string transfer(int digit);
int main()
{
char c;
int num,sum=0;
vector<int> result;
while ((c = cin.get()) != EOF && c!=10)
{
num = c - '0';
sum += num; //累加计算总和
}
if (sum == 0) //考虑总和为0的情况,此时直接输出zero
{
cout << "zero";
return 0;
}
while (sum != 0)
{
result.push_back(sum % 10); //从个位开始一位位往vector中添加数字
sum /= 10;
}
for (int i = result.size() - 1; i >= 0; i--) //倒序输出vector
{
if (i == result.size() - 1)
cout << transfer(result[i]);
else
cout << ' ' << transfer(result[i]);
}
return 0;
}
string transfer(int digit) //阿拉伯数字和英文转换器
{
switch (digit)
{
case 0:
return "zero";
break;
case 1:
return "one";
break;
case 2:
return "two";
break;
case 3:
return "three";
break;
case 4:
return "four";
break;
case 5:
return "five";
break;
case 6:
return "six";
break;
case 7:
return "seven";
break;
case 8:
return "eight";
break;
case 9:
return "nine";
break;
default:
break;
}
return "NaN"; //用不到,但函数必须得有返回值
}
一开始我没有考虑总和一开始就为0的情况,所以有一个测试点过不去。之后加上了一条专门判断总和是否为0的语句。