因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)[a,b](5≤a<b≤100,000,000)( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b .
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
输入 #1复制
5 500
输出 #1复制
5 7 11 101 131 151 181 191 313 353 373 383
实现这道题,首先明确两个概念,质数:除了1和它自身外,不能被其他自然数整除的数叫做质数。回文数:从左到右和从右到左是看一样的。那现在就是考虑如何实现对数的判断是否为质数和回文数。
首先考虑判断一个数n是否为质数,质数是除了1和它自身外,不能被其他自然数整除的数,换一种方式理解就是从2开始到n-1,中间都无法被n整除,所以一个简单的循环即可。代码:
int prime(int n) //判断是否为质数
{
int i, temp;
int flag = 0;
temp = sqrt(n);
for (i = 2; i <= temp; i++)
{
if ((n % i) == 0)
{
flag++;
break;
}
}
if (flag == 0)
return n;
else
return 0;
}
解决了质数,那么再看回文。回文数是从左到右和从右到左是看一样的,我们可以想到,将需要判断的数n逆序存在一个x中,判断n与x是否相等即可。代码:
int palin(int n) //判断是否回文
{
int temp, x = 0;
temp = n;
while (temp > 0)
{
x = x * 10 + temp % 10;
temp = temp / 10;
}
if (n == x)
return n;
else
return 0;
}
所以完整的代码实现,如下:
#include <stdio.h>
#include <math.h>
int prime(int n) //判断是否为质数
{
int i, temp;
int flag = 0;
temp = sqrt(n);
for (i = 2; i <= temp; i++)
{
if ((n % i) == 0)
{
flag++;
break;
}
}
if (flag == 0)
return n;
else
return 0;
}
int palin(int n) //判断是否回文
{
int temp, x = 0;
temp = n;
while (temp > 0)
{
x = x * 10 + temp % 10;
temp = temp / 10;
}
if (n == x)
return n;
else
return 0;
}
int main()
{
int a, b;
int i, j=0;
scanf("%d %d", &a, &b);
for (i = a; i <= b; i++)
{
if (palin(i) != 0) //先判断回文在判断质数,因为
{ //质数范围更大
if (prime(i) != 0)
printf("%d\n", i);
}
}
return 0;
}