C语言回文质数

该博客介绍了如何编写程序找出范围 [5, 100,000,000] 内的回文质数。首先,定义了回文质数的概念,即既是质数又是回文数的数字,如 151。然后,提供了输入输出格式和样例,并解释了算法思路,将质数判断和回文判断相结合。接着,给出了质数和回文数的代码实现,并讨论了为提高效率而选择先判断质数的策略。最后,展示了解决问题的完整代码。" 125778674,7432000,解决'pip'和'conda'命令不可用的问题,"['Python', 'pip', 'conda', '环境配置', '系统环境变量']

回文质数

题目描述

因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000),(a,b),(5≤a<b≤100,000,000)( 一亿)间的所有回文质数。

输入格式

第 1 行: 二个整数 a 和 b .

输出格式

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

输入输出样例

输入输出
5 5005
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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值