关于循环素数的一种解法(C语言)

循环素数:循环素数是一种特殊的素数,即对一个素数循环移位后仍然是素数。比如1193是个素数,对它循环移位后发现:1931,9311,3119也都是素数,具有这样特征的数就是循环素数。

求出所有五位数的循环素数:

整体思路是这样的:

1.找出所有五位数的素数

2.将它们存入一个数组

3.对数组(其中的数已经是素数)中的每个数,判断它是否为循环素数

判断流程:

1.取出每个数

2.取出每个数的个位、十位、百位、千位、万位。

3.由上述五个数还有四种组合

4.判断它们四个数是否全为素数,如果是,那么取出的这个数是循环素数,如果有一个不满足,即不是。

 

 代码全文:

#include <stdio.h>
void main()
{
	int a[10000];								//定义一个数组,用来存放五位数的素数 
	int u[50000];								//再定义一个数组,用来存放满足条件的素数,即循环素数 
	int i,y=0,o=0;								//初始化变量值
	
	//找出所有五位数中的素数 
	for(i=10000;i<=99999;i++)
	{
		if(isprime(i)==1)
		{
			
		//	printf("%d,",i); 
			a[y]=i;   							//找到后将它存入a数组 
			y++;	
		}
	}
	int j=0,k=0;
	printf("取出素数完毕,count=%d\n",y);		//看看找到了多少个五位数的素数 
	y=0;	
		
		//下面是对每个数进行判断,看其余四个数是否都为素数 
	while(a[y]!=0)
	{
	
		int t=a[y]; 							//先把每个数取出来 
		
		//然后取出每一位数 
		int g=t%10;  //个 
		int s=(t/10)%10;//十 
		int b=(t/100)%10;//百 
		int q=(t/1000)%10;//千 
		int w=t/10000;//万 
		//共有四种其它组合 
		//t=wqbsg         t2=qbsgw      t3=bsgwq      t4=sgwqb     t5=gwqbs
		int t2=q*10000+b*1000+s*100+g*10+w;
		int t3=b*10000+s*1000+g*100+w*10+q;
		int t4=s*10000+g*1000+w*100+q*10+b;
		int t5=g*10000+w*1000+q*100+b*10+s;
		//判断它们是否为素数 
		int flag2=isprime(t2);
		int flag3=isprime(t3);
		int flag4=isprime(t4);
		int flag5=isprime(t5);
		//int u[5000];
		if((flag2==1)&&(flag3==1)&&(flag4==1)&&(flag5==1))
		{
			printf("a[%d]=%d\n",y,a[y]);		//输出满足条件的a数组中的数,确认 
			
			u[j]=a[y];							//存入u数组 
			printf("u[%d]=%d\n",j,u[j]);		//确认一下,看看是否存入成功 
			j++;
		}
		y++;									//再判断下一个数 
	}
	printf("j=%d\n",j);
	int h=j;
	//printf("h=%d\n",h);
	printf("OK");
	printf("正在输出u数组\n");
	for(j=0;j<=h;j++){
		
	if(u[j]!=0)	printf("j=%d,u[%d]=%d\n",j,j,u[j]);
	}

	printf("OK");
	
	
	

}



int isprime(int n)
{
	int i;
	if(n>10000)
	{
	
		for(i=2;i<=n/2;i++)
		{
			if(n%i==0)
			return 0;  //不是素数 
	
		}
	return 1;  	//是素数 
	}
return 0;
}

总结:

这个解法太暴力,不够巧,代码量也很冗长,不简洁,容易出错。

再看一个大聪明写的:

#include <stdio.h>
void main(){	
	int a=0,i,j,t,b;
	for(i=10000;i<100000;i++){
		b=i;
	 loop:	for(t=2;t<b;t++){
			a=b%t;
			if(a==0) break;	
			}if(a!=0){
			b=(b*10)%100000+(b*10)/100000;
			if(b>10000){
				j++;
				if(j>5){
					printf("#%d#\n",i);
				}else goto loop;	
			}else a=0;
		}j=0;
	}
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小白.C.java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值