PAT 甲级刷题实录——1005

本贴最后更新于 1805 天前,其中的信息可能已经东海扬尘

原题链接

思路

这题相对比较简单,就是逐个读入数字然后加起来,算出来的总和从最高位开始逐位用英文输出。需要注意的是,题中所给的数字是连在一起的,没有用空格隔开,而如果直接用 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 的语句。

  • PAT
    25 引用 • 1 回帖 • 1 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...