PAT 甲级刷题实录——1015

本贴最后更新于 1761 天前,其中的信息可能已经时过境迁

原题链接

思路

这题要求判断一个数在翻转前后是否都是质数。有一个难以理解的地方是在给定进制下的翻转,这是指转成该进制表示的数之后翻转,再将翻转后的数转换回十进制判断。比如 11 在二进制下的翻转,首先转换为二进制表示形式 1011,之后翻转为 1101,再转换回十进制为 13 判断。另外,将十进制转换为其他进制的方法是用原数不断去除以进制数,并将每次得到的余数倒序记录下来,而由于我们还需要再翻转一次,所以在计算时直接依次将余数存在 vector 中最终得到的就是在给定进制下翻转后的数。

代码如下

代码

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	int num, radix, reverse;
	vector<int> result;	//1代表Yes,0代表No
	cin >> num;
	while (num >= 0)
	{
		reverse = 0;	//用于存储翻转后的数
		if (num < 2)	//1和0
		{
			result.push_back(0);
			cin >> num;
			continue;	//直接进入下一次循环
		}
		int flag = 1;
		cin >> radix;
		for (int i = 2; i < num; i++)	//判断原数是否为质数
		{
			if (num%i == 0)
			{
				flag = 0;
				break;
			}
		}
		vector<int> radixNum;
		while (num / radix > 0)
		{
			radixNum.push_back(num%radix);
			num /= radix;
		}
		radixNum.push_back(num);
		int exp = 1;
		for (int i = radixNum.size() - 1; i >= 0; i--)
		{
			reverse += radixNum[i] * exp;
			exp *= radix;
		}
		if (reverse < 2)	//1和0
		{
			result.push_back(0);
			cin >> num;
			continue;	//直接进入下一次循环
		}
		for (int i = 2; i < reverse; i++)	//判断翻转数是否为质数
		{
			if (reverse % i == 0)
			{
				flag = 0;
				break;
			}
		}
		result.push_back(flag);
		cin >> num;
	}
	for (int i = 0; i < result.size(); i++)
	{
		if (result[i] == 1)
			cout << "Yes" << endl;
		else
			cout << "No" << endl;
	}
	return 0;
}
  • PAT
    25 引用 • 1 回帖 • 1 关注
  • C++

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

    107 引用 • 153 回帖 • 2 关注

相关帖子

欢迎来到这里!

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

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