Description
因为 151151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151151 是回文质数。
写一个程序来找出范围 [�,�](5≤�<�≤100,000,000)[a,b](5≤a<b≤100,000,000)(一亿)间的所有回文质数。
Input
第一行输入两个正整数 �a 和 �b。
Output
输出一个回文质数的列表,一行一个。
Sample 1
Input:
5 500
Output:
5
7
11
101
131
151
181
191
313
353
373
383
Hint
Hint 1: Generate the palindromes and see if they are prime.
提示 1: 找出所有的回文数再判断它们是不是质数(素数).
Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.
提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。
题目翻译来自NOCOW。
USACO Training Section 1.5
产生长度为 55 的回文数:
for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数
for (d2 = 0; d2 <= 9; d2++) {
for (d3 = 0; d3 <= 9; d3++) {
palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
}
}
}
思路:
创建两个函数,一个“判断质数”的函数,另一个是“判断回文数”,对范围内的奇数进行遍历(只有奇数才有可能是回文数),这道题主要是靠查如何在尽可能短时间内运行出结果
笔者答案:
#include<stdio.h>
#include<math.h>
int zs(int m);
int hw(int n);
int main ()
{
int a,b,i;
scanf("%d %d",&a,&b);
if(a%2==0)
{
a++;
}
for(i=a;i<=b;)
{
if(hw(i)==1)//两个if语句应该分开,这样更快,并且要先判断回文数,因为回文数要少一点,质数要多一点
{
if(zs(i)==1)
{
printf("%d\n",i);
}
}
i+=2;
}
return 0;
}
int zs(int m)
{
int i;
for(i=2;i<=sqrt(m*1.0);i++)//根号法快于2分之一法
{
if(m%i==0)
{
return 0;
}
}
return 1;
}
int hw(int n)
{
int m = n;
int res=0,k;
while(m!=0)
{
k=m%10;
res=res*10+k;
m/=10;
}
if(res==n)
{
return 1;
}
else
{
return 0;
}
}
//素数的判断
//回文数的判断