感谢李振阳学长的辛苦调试!!!
写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)[a,b](5≤a<b≤100,000,000)( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b .
输出格式
输出一个回文质数的列表,一行一个。
本题采用构造法
首先要知道的一个点:
偶数位的回文质数都可被11整除,所以构造奇数位的即可,但是11不可以被忘了哦!!!
所以这段代码就是这个意思
if(i == 9 && a <= 11 && b >= 11)
{
puts("11");
}
下面就是具体代码:
#include<stdio.h>
int is_prime(int x) //判断质数的函数
{
if(x == 2) return 1;
for(int i = 2; i*i <= x; i++)
{
if(x % i == 0)
return 0;
}
return 1;
}
int main()
{
int a, b;
scanf("%d %d", &a, &b); //输入范围
for(int i = 5; i <= 100000; i ++)
{
if(i == 9 && a <= 11 && b >= 11) //其实也可以i=8,因为偶位数的回文数都可被11整除,我们就只需要构造奇数位的即可,但11也是偶数位的,所以这个if语句就是要输出11.
{
puts("11");
}
int tmp = i/10, ans = i; //构造奇数位的回文数,tmp是第二位
while(tmp > 0) //tmp有着判断位数的作用
{
ans *= 10;
ans = ans + tmp%10; //将数反转相加
tmp /= 10;
}
if(ans > b) break;
if(ans >= a && is_prime(ans)) printf("%d\n", ans); //再判断是否为质数
}
return 0;
}