P1217 [USACO1.5]回文质数 Prime Palindromes

280 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 题目描述

因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。

写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)a,b( 一亿)间的所有回文质数。 输入格式

第 1 行: 二个整数 a 和 b . 输出格式

输出一个回文质数的列表,一行一个。 输入输出样例

输入 #1复制

5 500

输出 #1复制

5 7 11 101 131 151 181 191 313 353 373 383

#include<iostream>
using namespace std;
int main()
{
	int m, n, j, i, k = 0, flag = 0;
	cin >> m >> n;
	if (m <= 5 && n >= 5)
		cout << "5" << endl;
	if (m <= 7 && n >= 7)
		cout << "7" << endl;
	if (m <= 11 && n >= 11)
		cout << "11" << endl;
	
	for(int a=1;a<10;a+=2)
		for (int b = 0; b < 10; b++)
		{
			flag = 0;
			int sum = a * 100 + b * 10 + a;
			if (sum < m)
				continue;
			if (sum > n)
				return 0;
			for (j = 3; j*j <= sum; j+=2)
			{
				if (sum % j == 0)
				{
					flag = 1;
					break;
				}
			}
			if (flag == 0)
				cout << sum << endl;
		}
	
	for (int a = 1; a < 10; a += 2)
		for (int b = 0; b < 10; b++)
			for(int c=0;c<10;c++)
			{
				flag = 0;
				int sum = a * 10000 + b * 1000 + c * 100 + b * 10 + a;
				if (sum < m)
					continue;
				if (sum > n)
					return 0;
				for (j = 3; j*j <=sum; j+=2)
				{
					if (sum % j == 0)
					{
						flag = 1;
						break;
					}
				}
				if (flag == 0)
					cout << sum << endl;
			}
 
	for (int a = 1; a < 10; a += 2)
		for (int b = 0; b < 10; b++)
			for (int c = 0; c < 10; c++)
				for(int d=0;d<10;d++)
			{
				flag = 0;
				int sum = a * 1000000 + b * 100000 +c*10000+d*1000+ c * 100 + b * 10 + a;
				if (sum < m)
					continue;
				if (sum > n)
					return 0;
				for (j = 3; j*j <= sum; j+=2)
				{
					if (sum % j == 0)
					{
						flag = 1;
						break;
					}
				}
				if (flag == 0)
					cout << sum << endl;
			}
	return 0;
}