首页 > 编程知识 正文

用c语言判断素数,判断一个数为素数的c程序

时间:2023-05-05 00:23:31 阅读:61928 作者:1315

1 .素数判断问题

素数判断问题是一个非常常见的问题,本文介绍了几种常用的判断方法。

2 .原始算法

素数的定义是可以被1和它自己整除,但不能被其他任何数整除的数。 根据素数的定义只需要将n除以2到n-1,如果都不能被整除,n就是素数,否则,只要其中有一个能被整除的数,n就不是素数。

boolis_primer1(intnum ) {

int i;

for(I=2; i num; I ) {

if(num%I==0) {

返回真;

}

}

返回假;

}

3 .算法改进

如果n不是素数,n可以表示为a*b。 其中,如果2=a=b=n-1,则必须满足a、b中的一个数。 1

boolis_primer2(intnum ) {

int i;

intupper=sqrt(num;

printf(primer2:%d(n ),upper );

for(I=2; i=upper; I ) {

if(num%I==0) {

返回真;

}

}

返回假;

}

4 .筛选算法

更有效地判断素数的方法应该是将素数存储在一个素数表中,然后在判断一个数是否是素数时直接检查表。 这种方法需要解决两个问题。

)1)如何快速拿到质量法? (采用筛选方法) ) ) ) ) ) ) )。

)2)如何减少质量法的大小? (采用位图数据结构)

对于从1到n的所有整数,逐一判断它们是否是素数,找到一个不是素数的,把它挖出来,最后剩下的就是素数。 具体方法是:

1定义is_primer[i]=true;

从2开始,依次遍历整个is_primer直到sqrt(N ),如果is_primer[i]=true,则is_primer[n*i]=false

像1、2、3、4、5、6、7、8、9、10

从2开始遍历:

如果is_primer[2]=true,则is _ primer [4]=is _ primer [6]=is _ primer [8]=is _ primer [ 10 ]=true

如果is_primer[3]=true,则is_primer[6]=is_primer[9]=true

为了减少内存利用率,该算法使用了位图数据结构。 有关位图的信息,请参见https://www.jb51.net/article/54439.htm

保存bool load_primer_table1()//素数表

int i;

for(I=1; i INT_MAX; I ) {

if(I%2!=0 //偶数一定不是素数

is_primer2(I ) }

set(I;

}

}

}

保存bool load_primer_table2() /素数表的另一种快速方法

int i,j;

for(I=1; i=INT_MAX; I ) {

if(I%2) {

set(I;

} else {

clear(I;

}

}

intupper=sqrt(int_max );

for(I=1; i=upper; I ) {

if(test ) I ) }

for(j=II; j INT_MAX; j =i )

set(I;

}

}

}

用boolis_primer3(longnum )//查找表判断是否是素数

if (测试) num ) )

返回真;

返回假;

}

5 .优化的筛选算法

(1)存储方式优化

在以位图方式保存的同时,只在位图中保存奇数即可一口气节省一半的空间。 (所需空间仅为4g/(32*2)=64MB ) )。

存储空间优化后,算法的效率也大大提高。 例如1、2、…、30

只需保存3、5、7、9、11、13、15、17、19、21、23、25、27和29

i=0,is_primer[0]=true,下标[3][6][9][12],即9、15、21、27标记为false

i=1,s_primer[0]=true,下标标记为[6][11],即15,25标记为false

I=2,2 * i3 sqrt (30 ),退出

即,令i=s,下标为s(2*t1 ) 3t,这里,令t=1、2、3、的所有is_primer为false

)2)优化筛选算法

a是素数,下一个起点是a*a,筛掉后面所有的a*a 2*i*a。 也就是说,要求n以内的素数,首先要求sqrt(n )内的素数,用已经求出的素数筛选后面的次数。

6 .总结

到目前为止,没有人发现素数的分布规律,也没有人能用一个公式计算所有的素数。 关于质数的很多有趣的性质和科学家的努力,例如:

) jjdxh推测n以内的素数的个数与n/ln(n )大致相同,或者,如果n大,则两者为相同数量级。 这就是有名的质数定理。

)2)十七世纪的费马推测2的2^n次幂为1,n=0,1,2…时为素数。 这种数被称为费马素数,可惜当n=5时,2^32不是素数,至今仍未找到第6个费马素数。

(3) 18世纪发现的最大素数为2 ^ 31-1,19世纪发现的最大素数为2 ^ 127-1,20世纪末人类已知的最大素数为2^859433-1,用十进制表示为258715位数字。

)4)双胞胎素数猜想:差异为2的素数有无限多的一对。 现在知道的最大双胞胎素数是11591429852^2304-1和11591429852^2304 1。

(5)哥德巴赫猜想:所有大于2的偶数是两个素数之和,所有大于5的奇数是三个素数之和。 其中第二个猜想是第一个自然推理,因此哥德巴赫的猜想也被称为1 1个问题。 我国数学家陈景润证明,1 2即大于2的偶数都是一个素数和只有两个素数因子的数之和。 国际上被称为陈氏定理。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。