笨方法写C语言程序:回文素数

问题:已知一个范围,如何输出该范围内所有的回文素数?
要解决这个问题先要明白两个知识。
一.什么是回文数
回文数就是一个数字,正着读和反着读一模一样,例如,121,34543,11等等(注意,个位数字也是回文数)
明白了什么是回文数,现在要考虑如何判断一个数字是回文数。
我的想法:
1.既然正读反读一样是它的定义,那么,假设输入的数字是number,我利用取余和取整循环着从后向前取出它的每一位,将其按位存入数组,这样就实现了反读。
2.接下来把这些数组里的数字循环着乘上10再加上下一位就可以得出反读后的数sum。
3.判断反读出来的数sum与原数number是否相等。一样的话即为回文数,否则不是。

(我个人觉得回文数更特殊,要少于素数,但是我没有证据。所以我在程序中先判断是不是回文数,在回文数的基础上再判断是不是素数。我认为这样可以提高效率。)

二.什么是素数
素数是指,除了1和自己之外没有任何因数的数。(0和1除外)
现在考虑如何判断一个数是素数。
我的方法极其简单粗暴,就是:已知的一个数number,那么从2开始到number为止,枚举所有的比它小的数看看可不可以整除number。如果可以,说明是number的因数,number即为合数;如果全都不可以,说明number是素数。
(由于我对循环的逻辑不甚了解所以我采用了计数的方法进行素数判断,详情看代码吧)

由于我的逻辑是:回文判断过后,符合条件才进行素数判断,所以,只要是素数判断后成功的即可输出。

下面到了令人高兴的代码阶段:

#include<stdio.h>
int judgehui(int number)//此函数判断是否为回文数
{
	int c[20]={0};
    int initial=number;
	int i=0;
	int num=0;
	while(number>0)
	{
	    c[i++]=number%10;//取末位
	    number=number/10;//舍去末位
	}
	for(int k=0;k<i;k++)//计算反读的数值
	{
		num=num*10;
		num+=c[k];
	}
    if(num==initial)
    return 1;//一样输出1
    else 
    return 0;
}
int judgesu(int number)//判断是否为素数
{
	int count2=0;
	int mark=0;
	if(number==0||number==1)//0和1是非素数
	mark=0;
    if(number==2)//2是素数
    mark=1;
    if(number>2)
	{
		for(int i=2;i<number;i++)
	 {
		if(number%i!=0)//对每一个不能整除的数都计数
		{
            count2++;
		}
     }
        if(count2==number-2)//若该数前面除了0,1以外的所有数都与它互质
        mark=1;//则为素数
	}
	return mark;
}
int main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	int number;
	for(number=a;number<b;number++)
	{
		if(judgehui(number)==1)//判断是否为回文数
		{
			if(judgesu(number)==1)//判断是否为素数
			printf("%d ",number);//输出该数
		}
	}
	return 0;
}

好了下面运行一下看看结果。

在这里插入图片描述
输入1和1000计算这个范围内的所有的回文素数,输出没有问题。

本代码不考虑时间问题,是否超时问题,因为我也没想到别的好方法,单纯分享一个好想的笨方法,就是利用定义写函数计算数据。

欢迎大家参与讨论。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值