2到100万为止输出100以内的素数数的个数 编程

C语言编程问题 求素数
C语言编程问题 求素数
#include&stdlib.h&#include&stdio.h&void readwriteDAT();
void num(int m,int k,int xx[]){&&int i,half,cnt=0;&&&&&&&&&&& /*定义变量cnt来统计已经取得的素数个数*/&int data=m+1;&&&&&&&&&&&&&&& /*从大于整数m的数开始找*/&while(1)&&&&&&&&&&&&&&&&&&&& /*循环条件始终为真,所以是无条件循环*/&{&& half=data/2;&&&&&&&&&&& /*求出当前数的一半,判断素数用*/&& for(i=2;i&=i++)&&& /*如果该数依次除以从2到一半的整数,余数都不是0,则该数是素数*/&&&& if(data%i==0)&&&&&&&& /*如果余数为0*/&&&&&&&&&&&&&&&&&&& /*则退出循环,取下一个数判断*/&& if(i&half)&& {&&&& xx[cnt]= &&cnt++;&&&&&&&&&&& /*判断该数为素数后,将该数存入数组xx中,并累计素数的个数*/&& }&& if(cnt&=k)&&&&&& /*如果累计素数的个数超过了要求的个数,则退出循环*/&& data++;&&&&&&&&&&&&&&&& /*如果累计素数的个数小于要求的个数,则继续取下一个数*/&}}
void main(){&int m,n,xx[1000];&system("CLS");&printf("\nPlease enter two integers:");&scanf("%d,%d",&m,&n);&num(m, n, xx);&for(m=0;m&n;m++)&&&& printf("%d ",xx[m]);&printf("\n");&readwriteDAT();}
void readwriteDAT(){&int m, n, xx[1000],i;&FILE *rf,*&rf=fopen("in.dat","r");&wf=fopen("out.dat","w");&for(i=0;i&10;i++)&&& {&&&& fscanf(rf,"%d %d",&m,&n);&&&& num(m,n,xx);&&&& for(m=0;m&n;m++)& &&&&&&& fprintf(wf,"%d ",xx[m]);&&&& fprintf(wf,"\n");&&& }&fclose(rf);
void num(int m,int k,int xx[]){&&int i,half,cnt=0;&&&&&&&&&&& /*定义变量cnt来统计已经取得的素数个数*/&int data=m+1;&&&&&&&&&&&&&&& /*从大于整数m的数开始找*/&while(1)&&&&&&&&&&&&&&&&&&&& /*循环条件始终为真,所以是无条件循环*/&{&& half=data/2;&&&&&&&&&&& /*求出当前数的一半,判断素数用*/&& for(i=2;i&=i++)&&& /*如果该数依次除以从2到一半的整数,余数都不是0,则该数是素数*/&&&& if(data%i==0)&&&&&&&& /*如果余数为0*/&&&&&&&&&&&&&&&&&&& /*则退出循环,取下一个数判断*/&& if(i&half)&& {&&&& xx[cnt]= &&cnt++;&&&&&&&&&&& /*判断该数为素数后,将该数存入数组xx中,并累计素数的个数*/&& }&& if(cnt&=k)&&&&&& /*如果累计素数的个数超过了要求的个数,则退出循环*/&& data++;&&&&&&&&&&&&&&&& /*如果累计素数的个数小于要求的个数,则继续取下一个数*/&}}
我想请问 什么时候用if(j&half)什么时候该用if(j&=half)
如下面一段程序就用的是if(j&=half);上面用的 是if(j&half)
#include&stdio.h&void writeDAT();int cnt,
void countValue(){&&int i,j;&&&&&&&&&&&&&&&&&&&& /*定义循环控制变量*/&&&&&&&&&&&&&&&&&&&& /*判断素数时所需值的存储变量*/&int xx[100];&&&&&&&&&&&&&&&& /*定义整型数组,用来保存素数*/&for(i=500;i&800;i++)&&&&&&&& /*在这个范围内进行挑选*/&{&& half=i/2;&& for(j=2;j&=j++)&&&& /*判断是否素数*/&&&& if(i%j==0)&&&&& /*如果该数不是素数,则退出此层循环*/&& if(j&=half)&&&&&&&&&&&&& /*如果该数是素数,则将该数存入数组yy中*/&& {&&&& xx[cnt]=i;&&&& cnt++;&&&&&&&&&&&&&& /*统计素数的个数*/&& }&}&for(i=0,j=-1;i&i++)&&&&&&& /*计算这些素数的间隔加、减之和*/&{&& j*=-1;&&&&&&&&&&&&&&&&&&&&&& /*用j来控制间隔的加减号*/&& sum+=j*xx[i];&}}
void main(){&cnt=sum=0;&countValue();&printf("素数的个数=%d\n",cnt);&printf("按要求计算得值=%d\n",sum );&writeDAT();}
void writeDAT(){&FILE *&fp=fopen("OUT.DAT","w");&fprintf(fp,"%d\n%d\n",cnt,sum);&fclose(fp);}
不区分大小写匿名
执行出来有区别么?没有吧。因为你这样判断素数并不是最精简的。最精简的应该判断到 根号data为止。根号data=date/2的,就是4了,但是4在i=2就break了
就是有问题我才问的啊。。2题我都试过了 反过来用2题都错了。。。
if(j&half)就是j比half大的时候条件成立,就可以执行if里面的语句,而if(j&=half)就是j大于等于half的时候成立,就比前面那个多个可成立条件(j=half),这要视情况而定,比如输出比3大的数,就要j&3,输出不小于3的数,就要j&=3
等待您来回答
编程领域专家JAVA 编程方法解决“ 输入一个数判断它是否是质数”
JAVA 编程方法解决“ 输入一个数判断它是否是质数”
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
for(int i=0;i<100;i++){
System.out.print("请输入数字:");
int num1 = input.nextInt();
if(num1==2||num1==3){
System.out.println(num1+"是质数");
else if(num1%2!=0&&(num1+1)%2==0){
System.out.println(num1+"是质数");
System.out.println(num1+"不是质数");
本人新手,只能做到这地步,我知道里面还差个条件,请高手指点。小弟在这里谢谢了!
不区分大小写匿名
else if(num1%2!=0&&(num1+1)%2==0){
System.out.println(num1+&是质数&);
}
else{
System.out.println(num1+&不是质数&);
15%2=1, (15+1)%2=0 -& 15是质数???
修改:
//前面略
else
{
int flag=1;
for(int j=2; j*j&=num1; j++)//这是质数的判断方法,只要除到这个数的开根号的数为止即可
if (num1%j==0){System.out.println(num1+&不是质数&); flag=0;}
if(flag) System.out.println(num1+&是质数&);
}
//后面略
//质数(又称为素数)就是在所有比1大的整数中,除了1和它本身以外,不再有别的约数,这种整数叫做质数或素数。
class Test
{
public static void main(String args[])
System.out.print(&请输入数字:&);
java.util.Scanner input = new java.util.Scanner(System.in);
int num1 = input.nextInt();
int x = 0;
for(int i=2;i&num1;i++)
if(num1 % i == 0)
System.out.println(&您输入的数字:& + num1 +&是质数。&);
System.out.println(&您输入的数字:& + num1 + &不是是质数!!&);
等待您来回答
编程领域专家已有天涯账号?
这里是所提的问题,您需要登录才能参与回答。
"天涯问答"是天涯社区旗下的问题分享平台。在这里您可以提问,回答感兴趣的问题,分享知识和经历,无论您在何时何地上线都可以访问,此平台完全免费,而且注册非常简单。
在编程中怎样确定一个数是不是素数?
在编程中怎样确定一个数是不是素数?
08-12-27 & 发布
素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。 有的数,如果单凭印象去捉摸,是无法确定它到底是不是素数的。有些数则可以马上说出它不是素数。一个数,不管它有多大,只要它的个位数是2、4、5、6、8或0,就不可能是素数。此外,一个数的各位数字之和要是可以被3整除的话,它也不可能是素数。但如果它的个位数是1、3、7或9,而且它的各位数字之和不能被3整除,那么,它就可能是素数(但也可能不是素数)。没有任何现成的公式可以告诉你一个数到底是不是素数。你只能试试看能不能将这 个数表示为两个比它小的数的乘积。 找素数的一种方法是从2开始用“是则留下,不是则去掉”的方法把所有的数列出来(一直列到你不想再往下列为止,比方说,一直列到10,000)。第一个数是2,它是一个素数,所以应当把它留下来,然后继续往下数,每隔一个数删去一个数,这样就能把所有能被2整除、因而不是素数的数都去掉。在留下的最小的数当中,排在2后面的是3,这是第二个素数,因此应该把它留下,然后从它开始往后数,每隔两个数删去一个,这样就能把所有能被3整除的数全都去掉。下一个未去掉的数是5,然后往后每隔4个数删去一个,以除去所有能被5整除的数。再下一个数是7,往后每隔6个数删去一个;再下一个数是11,往后每隔10个数删一个;再下一个是13,往后每隔12个数删一个。……就这样依法做下去。 你也许会认为,照这样删下去,随着删去的数越来越多,最后将会出现这样的情况;某一个数后面的数会统统被删去崮此在某一个最大的素数后面,再也不会有素数了。但是实际上,这样的情况是不会出现的。不管你取的数是多大,百万也好,万万也好,总还会有没有被删去的、比它大的素数。 事实上,早在公元前300年,希腊数学家欧几里得就已证明过,不论你取的数是多大,肯定还会有比它大的素数,假设你取出前6个素数,并把它们乘在一起:2*3*5*7*11*13=30030,然后再加上1,得30031。这个数不能被2、3、5、7、11、13整除,因为除的结果,每次都会余1。如果30031除了自己以外不能被任何数整除,它就是素数。如果能被其它数整除,那么30031所分解成的几个数,一定都大于13。事实上,39。 对于前一百个、前一亿个或前任意多个素数,都可以这样做。如果算出了它们的乘积后再加上1,那么,所得的数或者是一个素数,或者是比所列出的素数还要大的几个素数的乘积。不论所取的数有多大,总有比它大的素数,因此,素 数的数目是无限的。 随着数的增大,我们会一次又一次地遇到两个都是素数的相邻奇数对,如5,7;11,13;17,19;29,31;41,43;等等。就数学家所能及的数来说,它们总是能找到这样的素数对。这样的素数对到底是不是有无限个呢?谁也不知道。数学家认为是无限的,但他们从来没能证明它。这就是数学家为什么对素数感兴趣的原因。素数为数学家提供了一些看起来很容易、但事实却非常难以解决的问题,他们目前还没能对付这个挑战哩。 迄今为止,人类发现的最大的素数是 ,这是第 41 个 梅森(Mersenne)素数。 素数也叫质数,是只能被自己和 1 整除的数,例如2、3、5、7、11等。2500 年前,希腊数学家欧几里德证明了素数是无限的,并提出少量素数可写成“2 的n次方减 1”的形式,这里 n 也是一个素数。此后许多数学家曾对这种素数进行研究,17 世纪的法国教士马丁·梅森(Martin Mersenne)是其中成果较为卓著的一位,因此后人将“2的n次方减1”形式的素数称为梅森素数。 第19~41个梅森素数 序号 素数 位数 发现人 时间 41
7235733 John Findley 2004 40
6320430 Michael Shafer 2003 39
4053946 Michael Cameron 2001 38
2098960 Nayan, Woltman, Kurowski 1999 37
909526 Clarkson, Woltman, Kurowski 1998 36
895932 Spence, Woltman 1997 35
420921 Armengaud, Woltman 1996 34
378632 Slowinski & Gage 1996 33
258716 Slowinski & Gage 1994 32
227832 Slowinski & Gage 1992 31
65050 David Slowinski 1985 30
39751 David Slowinski 1983 29
33265 Welsh & Colquitt 1988 28
25962 David Slowinski 1982 27
13395 Slowinski & Nelson 1979 26
6987 L. Curt Noll 1979 25
6533 Nickel & Noll 1978 24
6002 Bryant Tuckerman 1971 23
3376 Donald B. Gillies 1963 22 3 Donald B. Gillies 1963 21 7 Donald B. Gillies 1963 20 2 Alexander Hurwitz 1961 19 1 Alexander Hurwitz 1961 1995 年,美国程序设计师乔治·沃特曼整理有关梅森素数的资料,编制了一个梅森素数计算程序,并将其放置在因特网上供数学爱好者使用,这就是“因特 网梅森素数大搜索”计划。目前有6万多名志愿者、超过20万台计算机参与这项计划。该计划采取分布式计算方式,利用大量普通计算机的闲置时间,获得相当于 超级计算机的运算能力,第 37、38 和 39 个梅森素数都是用这种方法找到的。美国一家基金会还专门设立了 10 万美元的奖金,鼓励第一个找到超过千万位素数的人。
请登录后再发表评论!
素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。 有的数,如果单凭印象去捉摸,是无法确定它到底是不是素数的。有些数则可以马上说出它不是素数。一个数,不管它有多大,只要它的个位数是2、4、5、6、8或0,就不可能是素数。此外,一个数的各位数字之和要是可以被3整除的话,它也不可能是素数。但如果它的个位数是1、3、7或9,而且它的各位数字之和不能被3整除,那么,它就可能是素数(但也可能不是素数)。没有任何现成的公式可以告诉你一个数到底是不是素数。你只能试试看能不能将这 个数表示为两个比它小的数的乘积。 找素数的一种方法是从2开始用“是则留下,不是则去掉”的方法把所有的数列出来(一直列到你不想再往下列为止,比方说,一直列到10,000)。第一个数是2,它是一个素数,所以应当把它留下来,然后继续往下数,每隔一个数删去一个数,这样就能把所有能被2整除、因而不是素数的数都去掉。在留下的最小的数当中,排在2后面的是3,这是第二个素数,因此应该把它留下,然后从它开始往后数,每隔两个数删去一个,这样就能把所有能被3整除的数全都去掉。下一个未去掉的数是5,然后往后每隔4个数删去一个,以除去所有能被5整除的数。再下一个数是7,往后每隔6个数删去一个;再下一个数是11,往后每隔10个数删一个;再下一个是13,往后每隔12个数删一个。……就这样依法做下去。 你也许会认为,照这样删下去,随着删去的数越来越多,最后将会出现这样的情况;某一个数后面的数会统统被删去崮此在某一个最大的素数后面,再也不会有素数了。但是实际上,这样的情况是不会出现的。不管你取的数是多大,百万也好,万万也好,总还会有没有被删去的、比它大的素数。 事实上,早在公元前300年,希腊数学家欧几里得就已证明过,不论你取的数是多大,肯定还会有比它大的素数,假设你取出前6个素数,并把它们乘在一起:2*3*5*7*11*13=30030,然后再加上1,得30031。这个数不能被2、3、5、7、11、13整除,因为除的结果,每次都会余1。如果30031除了自己以外不能被任何数整除,它就是素数。如果能被其它数整除,那么30031所分解成的几个数,一定都大于13。事实上,39。 对于前一百个、前一亿个或前任意多个素数,都可以这样做。如果算出了它们的乘积后再加上1,那么,所得的数或者是一个素数,或者是比所列出的素数还要大的几个素数的乘积。不论所取的数有多大,总有比它大的素数,因此,素 数的数目是无限的。 随着数的增大,我们会一次又一次地遇到两个都是素数的相邻奇数对,如5,7;11,13;17,19;29,31;41,43;等等。就数学家所能及的数来说,它们总是能找到这样的素数对。这样的素数对到底是不是有无限个呢?谁也不知道。数学家认为是无限的,但他们从来没能证明它。这就是数学家为什么对素数感兴趣的原因。素数为数学家提供了一些看起来很容易、但事实却非常难以解决的问题,他们目前还没能对付这个挑战哩。 迄今为止,人类发现的最大的素数是 ,这是第 41 个 梅森(Mersenne)素数。 素数也叫质数,是只能被自己和 1 整除的数,例如2、3、5、7、11等。2500 年前,希腊数学家欧几里德证明了素数是无限的,并提出少量素数可写成“2 的n次方减 1”的形式,这里 n 也是一个素数。此后许多数学家曾对这种素数进行研究,17 世纪的法国教士马丁·梅森(Martin Mersenne)是其中成果较为卓著的一位,因此后人将“2的n次方减1”形式的素数称为梅森素数。 第19~41个梅森素数 序号 素数 位数 发现人 时间 41
7235733 John Findley 2004 40
6320430 Michael Shafer 2003 39
4053946 Michael Cameron 2001 38
2098960 Nayan, Woltman, Kurowski 1999 37
909526 Clarkson, Woltman, Kurowski 1998 36
895932 Spence, Woltman 1997 35
420921 Armengaud, Woltman 1996 34
378632 Slowinski & Gage 1996 33
258716 Slowinski & Gage 1994 32
227832 Slowinski & Gage 1992 31
65050 David Slowinski 1985 30
39751 David Slowinski 1983 29
33265 Welsh & Colquitt 1988 28
25962 David Slowinski 1982 27
13395 Slowinski & Nelson 1979 26
6987 L. Curt Noll 1979 25
6533 Nickel & Noll 1978 24
6002 Bryant Tuckerman 1971 23
3376 Donald B. Gillies 1963 22 3 Donald B. Gillies 1963 21 7 Donald B. Gillies 1963 20 2 Alexander Hurwitz 1961 19 1 Alexander Hurwitz 1961 1995 年,美国程序设计师乔治·沃特曼整理有关梅森素数的资料,编制了一个梅森素数计算程序,并将其放置在因特网上供数学爱好者使用,这就是“因特 网梅森素数大搜索”计划。目前有6万多名志愿者、超过20万台计算机参与这项计划。该计划采取分布式计算方式,利用大量普通计算机的闲置时间,获得相当于 超级计算机的运算能力,第 37、38 和 39 个梅森素数都是用这种方法找到的。美国一家基金会还专门设立了 10 万美元的奖金,鼓励第一个找到超过千万位素数的人。
请登录后再发表评论!
素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。 有的数,如果单凭印象去捉摸,是无法确定它到底是不是素数的。有些数则可以马上说出它不是素数。一个数,不管它有多大,只要它的个位数是2、4、5、6、8或0,就不可能是素数。此外,一个数的各位数字之和要是可以被3整除的话,它也不可能是素数。但如果它的个位数是1、3、7或9,而且它的各位数字之和不能被3整除,那么,它就可能是素数(但也可能不是素数)。没有任何现成的公式可以告诉你一个数到底是不是素数。你只能试试看能不能将这 个数表示为两个比它小的数的乘积。 找素数的一种方法是从2开始用“是则留下,不是则去掉”的方法把所有的数列出来(一直列到你不想再往下列为止,比方说,一直列到10,000)。第一个数是2,它是一个素数,所以应当把它留下来,然后继续往下数,每隔一个数删去一个数,这样就能把所有能被2整除、因而不是素数的数都去掉。在留下的最小的数当中,排在2后面的是3,这是第二个素数,因此应该把它留下,然后从它开始往后数,每隔两个数删去一个,这样就能把所有能被3整除的数全都去掉。下一个未去掉的数是5,然后往后每隔4个数删去一个,以除去所有能被5整除的数。再下一个数是7,往后每隔6个数删去一个;再下一个数是11,往后每隔10个数删一个;再下一个是13,往后每隔12个数删一个。……就这样依法做下去。 你也许会认为,照这样删下去,随着删去的数越来越多,最后将会出现这样的情况;某一个数后面的数会统统被删去崮此在某一个最大的素数后面,再也不会有素数了。但是实际上,这样的情况是不会出现的。不管你取的数是多大,百万也好,万万也好,总还会有没有被删去的、比它大的素数。 事实上,早在公元前300年,希腊数学家欧几里得就已证明过,不论你取的数是多大,肯定还会有比它大的素数,假设你取出前6个素数,并把它们乘在一起:2*3*5*7*11*13=30030,然后再加上1,得30031。这个数不能被2、3、5、7、11、13整除,因为除的结果,每次都会余1。如果30031除了自己以外不能被任何数整除,它就是素数。如果能被其它数整除,那么30031所分解成的几个数,一定都大于13。事实上,39。 对于前一百个、前一亿个或前任意多个素数,都可以这样做。如果算出了它们的乘积后再加上1,那么,所得的数或者是一个素数,或者是比所列出的素数还要大的几个素数的乘积。不论所取的数有多大,总有比它大的素数,因此,素 数的数目是无限的。 随着数的增大,我们会一次又一次地遇到两个都是素数的相邻奇数对,如5,7;11,13;17,19;29,31;41,43;等等。就数学家所能及的数来说,它们总是能找到这样的素数对。这样的素数对到底是不是有无限个呢?谁也不知道。数学家认为是无限的,但他们从来没能证明它。这就是数学家为什么对素数感兴趣的原因。素数为数学家提供了一些看起来很容易、但事实却非常难以解决的问题,他们目前还没能对付这个挑战哩。 迄今为止,人类发现的最大的素数是 ,这是第 41 个 梅森(Mersenne)素数。 素数也叫质数,是只能被自己和 1 整除的数,例如2、3、5、7、11等。2500 年前,希腊数学家欧几里德证明了素数是无限的,并提出少量素数可写成“2 的n次方减 1”的形式,这里 n 也是一个素数。此后许多数学家曾对这种素数进行研究,17 世纪的法国教士马丁·梅森(Martin Mersenne)是其中成果较为卓著的一位,因此后人将“2的n次方减1”形式的素数称为梅森素数。 第19~41个梅森素数 序号 素数 位数 发现人 时间 41
7235733 John Findley 2004 40
6320430 Michael Shafer 2003 39
4053946 Michael Cameron 2001 38
2098960 Nayan, Woltman, Kurowski 1999 37
909526 Clarkson, Woltman, Kurowski 1998 36
895932 Spence, Woltman 1997 35
420921 Armengaud, Woltman 1996 34
378632 Slowinski & Gage 1996 33
258716 Slowinski & Gage 1994 32
227832 Slowinski & Gage 1992 31
65050 David Slowinski 1985 30
39751 David Slowinski 1983 29
33265 Welsh & Colquitt 1988 28
25962 David Slowinski 1982 27
13395 Slowinski & Nelson 1979 26
6987 L. Curt Noll 1979 25
6533 Nickel & Noll 1978 24
6002 Bryant Tuckerman 1971 23
3376 Donald B. Gillies 1963 22 3 Donald B. Gillies 1963 21 7 Donald B. Gillies 1963 20 2 Alexander Hurwitz 1961 19 1 Alexander Hurwitz 1961 1995 年,美国程序设计师乔治·沃特曼整理有关梅森素数的资料,编制了一个梅森素数计算程序,并将其放置在因特网上供数学爱好者使用,这就是“因特 网梅森素数大搜索”计划。目前有6万多名志愿者、超过20万台计算机参与这项计划。该计划采取分布式计算方式,利用大量普通计算机的闲置时间,获得相当于 超级计算机的运算能力,第 37、38 和 39 个梅森素数都是用这种方法找到的。美国一家基金会还专门设立了 10 万美元的奖金,鼓励第一个找到超过千万位素数的人。
请登录后再发表评论!输入您的搜索字词
提交搜索表单
您现在的位置:&&>>&&>>&&>>&&>>&正文
实例编程:费尔马二平方素数
&&& 费尔马“二平方”素数问题的提出除2这个特别的素数外,所有的素数都可以分成两类:第一类是被4除余1的素数,如5,13,17,2937,41;第二类是被4除余3的素数,如3,7,11,19,23,31.第一类素数都能表示成两个整数的平方和(第二类则不能)。
&&& 例如:5=1-1+2*213=2*2+3*317=1*1+4*4& 29=2*2+5*5这就是著名的费尔马“二平方”定理。有趣的是:上述等式右侧的数有的又恰恰是两个素数的平方,如13,29的表达式,我们起名叫作费尔马“二平方”素数,即如果一个素数能够表示成两个素数的平方和的形式:F=X*X+Y *Y (1)其中F、X、Y 都是素数,它就是费尔马“二平方”素数。
&&& 编程思路本文拟用c 语言编程,求42亿之内的费尔马“二平方”素数。如果按定义从左向右,先求一个素数F,然后再去找相应的素数X、Y ,工作量重复太大。我们可以对上述公式进行分析:1、左侧F 是素数,它肯定是奇数,那么右侧两式的和也应该是奇数,这样X 和Y 为一奇一偶,因为奇数的平方还是奇数,偶数的平方还是偶数。X、Y 又要求是素数,而既是偶数又是素数的数只有一个,就是2。我们假定X=2。所以(1)式可以简化为:F=2*2+Y *Y(2)也就是说,费尔马“二平方”素数的表示形式是惟一的。
&&& 2、按式(2)由右向左,由小到大找素数Y ,再计算出相应的F,判断其是否素数。
&&& 3、求出素数Y 后将其保存起来,在判断其它数是否素数时可直接用已求出的素数去除,如此反复。
&&& 源程序
&#include&math.h&void&main(){&&&&unsigned&long&i,j,a[10000],m,m1=3,m2=7,b=1,n=0,d=1,x=;&&&&a[1]=2;10:for(i=m1;i&=m2;i++,i++){&&&&if(i%a[1]==0)&goto&13;&&&&for(j=2;j&=d-1;j++)&&&&if(i%a[j]==0)&goto&13;&&&&a[b++]=i;&m=i*i+4;&&&&if(m&x)&goto&14;&&&&for(j=2;j&=b-2;j++)&&&&if(m%a[j]==0)&goto&13;&&&&printf("%20lu=2*2+%5lu*%5lu",m,i,i);&&&&if(++n%2==0)&printf("\n");&&&&13:m1=m2+4;&m2=a[++d]*a[d]-2;&&&&goto&10;&&&&14:printf("\ntotal=%lu\n",n);}&&& 结论&&& 运行程序会发现,除“29=2*2+5*5”以外,所有的费尔马“二平方”素数个位数字都是3,相应Y&的个位数字都是3或7。费尔马“二平方”素数分布(修改程序中变量x&的值得到)也很耐人寻味,请看下表(表中10万以内包含1万以内,下同):范围个数最大的一个的表达式&&& 1万109413=2*2+97*97&&& 10万2097973=2*2+313*313&&& 100万42994013=2*2+997*997&&& 1000万769223373=2*2+3037*3037&&& 1亿18397752773=2*2+9887*9887&&& 10亿427999002453=2*2+31607*31607&&& 20亿5511983188093=2*2+44533*44533&&& 30亿6412993512373=2*2+54713*54713&&& 40亿7183977446493=2*2+63067*63067&&& 费尔马“二平方”素数太少了,40亿内才718个,千万分之二还不到呢。&&随着数的范围的增大,似乎越来越稀少,但再往后永远是这样吗?会不会在某个范围内反而又稠密起来呢?&&费尔马“二平方”素数是无穷多个呢,还是有限多个呢?如果是有限个,又是多少个呢?最大的一个又是什么数呢?&&这些问题的证明可能很简单,也许很复杂,真说不定会成为像“哥德巴赫猜想”那样的谜呢!&&& 下面是作者原程序,因为是中文全角,上面的就改了一下原文放在下面对照:
&#include″math&.h″main(){unsigned&longi&,j&,a[10000],m,m1=3,m2=7,b&=1,n&=0,d&=1,x=4000000000;a[1]=2;l0:for&(i&=m1;i&<=m2;i&++,i&++){if&(i&%a[1]==0)goto&l3;for&(j&=2;j&<=d&-1;j&++)if&(i&%a[j]==0)goto&l3;a[b&++]=i&;m=i&*i&+4;if&(m>x)goto&l4;for&(j&=2;j&<=b&-2;j&++)if&(m%a[j]==0)goto&l3;printf(″%20lu&=2*2+%5lu&*%5lu″,m,i&,i);if&(++n&%2==0)printf(″\n″);l3:;}m1=m2+4;m2=a[++d]*a[d]-2;goto&l0;l4:printf(″\ntotal&=%lu\n″,n);}
【责编:ben】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
相关产品和培训
 友情推荐链接
 认证培训
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 社区讨论
 博客论点
 频道精选
 C/C++频道相关导航

我要回帖

更多关于 求1到100之间的素数 的文章

 

随机推荐