回文质数
题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000),(a,b),(5≤a<b≤100,000,000)( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b .
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
| 输入 | 输出 |
|---|---|
| 5 500 | 5 |
| 7 | |
| 11 | |
| 101 | |
| 131 | |
| 151 | |
| 181 | |
| 191 | |
| 313 | |
| 353 | |
| 373 | |
| 383 |
思路
显然回文质数就是同时满足质数与回数的数,那么我们只需要找到质数与回数求“&&”即可。
质数代码
int su(int x)
{
int i,j;
for(i=2;i<sqrt(x)+1;i++) //+1是为了防止x==4的情况。
if(!(x%i))
return 0;
return 1;
}
质数代码很轻松就解决了,回数代码也一样。
回数代码
int hui(int x)
{
int i,j,m,n,wei,ge=x; //这一段是为了找到数字的位数。
for(wei=1;;wei++){
ge=ge/10;
if(!ge)
break;
}
if(!(wei%2)&&(x-11)) //易得除了11以外的偶数位回数都不是质数,不信你自己找几个数字试试。
return 0;
for(i=0,j=wei-1;;i++,j--){ //这一段代码是找到回数。
m=x/(pow(10,i));
n=x/(pow(10,j));
if((m%10)-(n%10))
return 0;
if(i>=j)
return 1;
}
}
到现在,问题已经基本解决,但是为了提高运行效率,我们还要考虑一点
回数和质数谁放前面?
众所周知,质数比回数少(应该 )。
所以我们选择把质数放在前面。
以下是完整代码
#include<stdio.h>
#include"math.h"
int num=0;
int su(int x)
{
int i,j;
for(i=2;i<sqrt(x)+1;i++)
if(!(x%i))
return 0;
return 1;
}
int hui(int x)
{
int i,j,m,n,wei,ge=x;
for(wei=1;;wei++){
ge=ge/10;
if(!ge)
break;
}
if(!(wei%2)&&(x-11))
return 0;
for(i=0,j=wei-1;;i++,j--){
m=x/(pow(10,i));
n=x/(pow(10,j));
if((m%10)-(n%10))
return 0;
if(i>=j)
return 1;
}
}
int main()
{
int i,j,a,b;
scanf("%d%d",&a,&b);
for(i=a;i<=b;i++)
if(hui(i)&&su(i))
printf("%d\n",i);
return 0;
}
该博客介绍了如何编写程序找出范围 [5, 100,000,000] 内的回文质数。首先,定义了回文质数的概念,即既是质数又是回文数的数字,如 151。然后,提供了输入输出格式和样例,并解释了算法思路,将质数判断和回文判断相结合。接着,给出了质数和回文数的代码实现,并讨论了为提高效率而选择先判断质数的策略。最后,展示了解决问题的完整代码。"
125778674,7432000,解决'pip'和'conda'命令不可用的问题,"['Python', 'pip', 'conda', '环境配置', '系统环境变量']


被折叠的 条评论
为什么被折叠?



