原题链接
思路
这题相对比较简单,就是逐个读入数字然后加起来,算出来的总和从最高位开始逐位用英文输出。需要注意的是,题中所给的数字是连在一起的,没有用空格隔开,而如果直接用 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 的语句。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于