编程无穷素数
A. c语言 求100—200之间的全部素数,并且输出每10个换一行
第一个问题的分析:如果满足i<=k,则说明这个数不是素数,则不用输出,不执行下面的printf的函数,只有满足i>=k+1(其实是满足1=k+1),才能判断此数为素数,则输出。所以程序是正确的。
第二个问题的分析:两个程序的最终结果是一样的,都是正确的。
程序自然结束后,会有i==k+1,此时是素数,打印数字;而如果是break出循环,则假设不成立,为合数,不打印字符,执行下一次循环。
(1)编程无穷素数扩展阅读:
如果 为合数,因为任何一个合数都可以分解为几个素数的积;而N和N+1的最大公约数是1,所以不可能被p1,p2,……,pn整除,所以该合数分解得到的素因数肯定不在假设的素数集合中。因此无论该数是素数还是合数,都意味着在假设的有限个素数之外还存在着其他素数。所以原先的假设不成立。也就是说,素数有无穷多个。
B. 怎么证明有无穷个素数
反证法,
假设素数有有限多个,分别为a1,a2,……an
则构造一个数a(n+1)=(a1*a2*……*an)+1
这个数不是任何一个素数的倍数,所以为素数,矛盾
得证
C. 如何证明素数又无穷多个
假设素数只有有限个,记为p1,p2,……,pn。考虑这个数(p1p2……pn)+1=a,则a为合数,故必有素因子q。由于只有有限个素数,q必是上述n个素数中的一个。但是,a除以上述n个素数中的任何一个都余1,这与n是q的倍数矛盾!
所以,素数有无穷多个
D. C语言求100以内素数的问题
#include<stdio.h>
int main()
{
int i=0;
int count=0;
for(i=0;i<=100;i++)
{
int j=0;
for(j=2;j<=i;j++)
{
if(i%j==0)
{
break;
}
}
if(i==j)
{
count++;
printf("%d ",i);
}
}
printf(" count=%d ",count);
return 0;
}
解题思路:
素数,就是除了1和他本身,不能被其他数整除的数字。答案就是用100到200之间的每个数字,除以2到其本身前面的那一个数字,如果此过程中出现整除的现象,则该数不是素数。如果没有整除的现象,则该数为素数输出。
(4)编程无穷素数扩展阅读:
质数又称素数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数。
质数的个数是无穷的。欧几里得的《几何原本》中有一个经典的证明。它使用了证明常用的方法:反证法。具体证明如下:假设质数只有有限的n个,从小到大依次排列为p1,p2,……,pn,设N=p1×p2×……×pn,那么,要大于p1,p2,……,pn,所以它不在那些假设的素数集合中。
E. 如何证明素数个数是无穷的(详细过程)
(反证) 假设素数是有限的,假设素数只有有限的n个,最大的一个素数是p 设q为所有素数之积加上1,那么,q = ( 2 * 3 * 5 * …… * p )+ 1不是素数 那么,q可以被2、3、……、p中的数整除 而q被这2、3、……、p中任意一个整除都会余1,与之矛盾 所以,素数是无限的。 (也可以这样说明:若q能被小于q的数整除,情况有两种,被小于q的素数或被小于q的合数。小于q的素数也就包括在2,3,5,…… p 中,明显不能被他们整除;如果能被小于q的合数m整除,合数m又可以分为两个更小的素数相乘,设m=s*t,则s<m<q,t<m& lt;q,那么q肯定能被s或t中的任何一个整除,而s和t都是小于q的素数,都不能整除q,所以就矛盾。)
满意请采纳
F. 怎样证明素数有无穷多个
这是《数学天书中的证明》中的第一个问题。书中列举了6种证法,这里只说一下大概思路:
(1)假设素数有限,所有素数之积加一不能被任何素数整除,于是我们得到一个新的素数,矛盾。
(2)因为任意两个费马数互素,而费马数有无穷多个,因此有无穷多个素数。
(3)令p为最大的素数,考虑梅森数2^p - 1的素因子。任意一个该数的素因子都大于p,矛盾,所以不存在最大的素数。
(4)log(x)是素数计数函数的一个下界,因为log(x)无界,所以素数无限。
(5)构造整数集上的一个拓扑,使素数和该拓扑上的某些既开又闭的集合一一对应,从而导出一个开集{-1, 1},然后证明{-1, 1}不可能是开集。
(6)证明
发散。
G. 判断是否是素数编程
#include<stdio.h>
int fun(int x)
{
for(int i=2;i<x;i++)
if(x%i==0)
return 0;
return 1;//是素数返回值为 1;
}
int main()
{
int n;
scanf("%d",&n);
if(n<2)
{
while(1)//无限循环,不执行break一直循环;
{
printf("输入错误;请重新输入 ");
scanf("%d",&n);
if(n>=2)
{
printf("输入正确;开始判断 ");
if(fun(n))
{
printf("%d is a prime number.",n);
break;
}
else
{
printf("%d is not a prime number.",n);
break;
}
}
}
}
else//n>=2时的素数判断;
{
if(fun(n))
printf("%d is a prime number.",n);
else
printf("%d is not a prime number.",n);
}
return 0;
}
H. c语言输出100到200之间的素数
解题思路:
首先先找出来100~200以内的所有整数,再让这些整数对除了1和它本身以外的数求余,如果有能整除的就不是素数,否则就为素数。
先找出来100到200的所有整数,都为i
用i去对除了1和它本身以外的数求余。
正确的代码:
#include<stdio.h>
int main()
{
int conut = 0;
int i = 0;
for(i=100; i<=200; i++)
{
int j = 0;
for(j=2; j<i; j++)
{
if(i%j == 0)
break;
}
if(j==i)
{
conut++;
printf("%d ", i);
}
}
printf(" ");
printf("素数个数为:%d ", conut);
return 0;
}
第二个if语句的判断条件应该是j==i;而不是i%j 。
(8)编程无穷素数扩展阅读:
实现的其他方法:
需要用到sort函数,也就是开平方根函数。头文件为#include<math.h>。 显而易见,任何一个数,每一对因子都是由这个数开平方后的数的左右各一个组成,所以,在求余过程中,只需要对从2到开平方之后的数求余即可。遇到可以整除的就不是素数,否则就为素数。
代码:
#include<stdio.h>
#include<math.h>
int main()
{
int count = 0;
int i = 0;
for(i=100; i<=200; i++)
{
int j = 0;
for(j=2; j<=sqrt(i); j++)
{
if(i%j == 0)
break;
}
if(j > sqrt(i))
{
count++;
printf("%d ",i);
}
}
printf(" ");
printf("素数个数为:%d", count);
return 0;
}
I. 关于"素数无穷多"的疑问
只能说明这种证明方法不完善,并且,素数的表示方法并非就这一种,还有其他表示方法,如:n!+1,我们可以这样证明:
假设素数个数有限,则必有一个最大的
设最大的素数是P
令n=2*3*5*7*……*P+1
即把所有的素数相乘并加上1
显然n>P
若因为P是最大素数,所以n是合数
则n能被2,3,……,P中至少一个素数整除
但用这些数去除n,都有余数1,即都不能整除
这就有两种可能
(1),n是素数
(2),n是合数,但他只能被大于P的素数整除
这两种情况都和P是最大素数矛盾。
所以假设错误
所以素数是无限
也可以如下证明:
素数与公因数
1、素数 我们知道,大于1,并且除1和它本身外没有其他因数的自然数叫素数(或质数)
2是最小的素数,除2以外,所有的偶数都不是素数。
按顺序,下列为一个小素数序列:
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,…
不是素数的整数a>1称为合数。例如,因为有3|39,所以39是合数。整数1被称为基数,它既不是质数也不是合数。类似地,整数0和所有负整数既不是素数也不是合数。
关于素数,有如下重要结论:
①素数有无穷个。
证明:假设素数只有有限的n个,从小到大依次排列为p1,p2,...,pn,则 x = (p1·p2·...·pn)+1 显然是不能被p1,p2,...,pn中的任何一个素数整除的,因此x也是一个素数,这和只有n个素数矛盾,所以素数是无限多的。
这个证明的最早来自亚里士多德,非常漂亮,是反证法的经典应用,这个证明被欧拉称为“直接来自上帝的证明”,历代的数学家也对其评价很高。
但是,千万不可认为,形如p1·p2·...·pn+1(其中p1,p2,...,pn均为素数)的数就一定是素数!第八届全国青少年信息学奥林匹克联赛(NOIP2002)提高组初赛试题第三题第2小题,写程序运行结果,程序要找的就是形如p1·p2·...·pn+1(其中p1,p2,...,pn均为素数)的数中第一个是合数的整数。
2*3+1=7 是素数
2*3*5+1=31 是素数
2*3*5*7+1=211 是素数
2*3*5*7*11+1=2311 是素数
2*3*5*7*11*13+1=30031 不是素数,因为30031=59*509
引用内容
华东师范大学版的数学9年级教材P94有这样一个命题:
从素数2开始,排在前面的任意多个素数的乘积加1一定也是素数。
这个结论就是错误的。
虽然最大的素数是不存在的,但是人们却对探知最大的素数乐此不疲。
213466917-1
这是到目前为止人类所发现的最大素数,它是由Michael在2001年12月7日发现的,这是一个梅森素数,有4,053,946位数字。
所谓梅森素数,是以17世纪法国修道士M.梅森的名字命名的.梅森在1644年出版的着作《物理数学随感》的序言中宣称,对于n=2,3,5,7,13,17,19,31,67,127,257,数Mn=2n-1是素数,而对于其他所有小于257的数n,Mn是合数.但是,这里出现了5个错误,M67,M257不是素数,而M61,M89,M107是素数.显然,要使Mn是素数,n本身必须是素数,但是反过来,n是素数,Mn却不一定是素数,例如虽然11是素数,可是M11=2047=23X89是合数.
现在寻找很大的梅森素数时,已经完全依赖于计算机了,可以想象,离开了计算机,我们人类将会落入一种怎样的地步.当D.H.莱默博士这位曾经在梅森素数上花费了许多时光的老学者,亲眼看到了计算机在短短的48秒钟内做完了他20年前花费了700多小时才完成的艰辛劳动,最后证明2257-1是一个合数时,他是多么地感慨万端哪.
时至今日,人类只找到39个梅森素数.前18个梅森素数是n=2,3,5,7,13,17,19,31,61,89,107,127,521,607,1279,2203,2281,3217时的Mn=2n-1.下表列出了从1961年以来所发现的全部梅森素数.
------------------------------------------------------------------------------
素数是无限的,欧几里得在《几何原本》里面已经给出了证明,现在已经有很多种证明方法了。这里我收集一两个。
证法一:
(一)学过初中的同学都知道n!与n!+1互质。故n!与1、2、3、…..n-1、n互质那么n!+1有2种可能(1)n!+1为素数。(2)n!+1为合数
(1)设a=n!+1为素数 集合A={x|0<x≤n x∈N}有b个素数,则集合B={x|0<x≤n!+1 x∈N}内至少有b+个素数
(2)设a=n!+1为合数则在集合B\A中至少有2个元素可以被a整除
易证:c=min{x|x∈B\A 且a/x=h h∈N}为素数。同(1)设集合A内有b个素数。则集合B内至少有b+1个素数
综合(1)、(2)可得:设集合A={x|0<x≤n x∈N}有b个素数,则集合B={x|0<x≤n!+1 x∈N}内至少有b+个素数。
重复(一)操作可得集合C={x|o<x≤(n!+1)!+1 x∈N}内至少有b+2个素数。
继续沿用(一)的操作,用数学归纳法可证:设集合A={x|0<x≤n x∈N}有b个素数,则集合D={x|o<x≤{[(n!+1)!+1]!+1…..}内至少有b+d个素数
d重
由此:当d→+∞时,e=素数的个数≥b+d=+∞
证明完毕。
证法二:(反证)
假设素数是有限的,假设素数只有有限的n个,最大的一个素数是p
设q为所有素数之积加上1,那么,q = ( 2 * 3 * 5 * …… * p )+ 1不是素数
那么,q可以被2、3、……、p中的数整除
而q被这2、3、……、p中任意一个整除都会余1,与之矛盾
所以,素数是无限的。
(也可以这样说明:若q能被小于q的数整除,情况有两种,被小于q的素数或被小于q的合数。小于q的素数也就包括在2,3,5,…… p 中,明显不能被他们整除;如果能被小于q的合数m整除,合数m又可以分为两个更小的素数相乘,设m=s*t,则s<m<q,t<m<q,那么q肯定能被s或t中的任何一个整除,而s和t都是小于q的素数,都不能整除q,所以就矛盾。)
J. c#求素数
int j, n = 0;
Console.WriteLine("输出1000以内的所有素数:");
for (int i = 2; i <= 1000; i++)
{
for (j = 2; j <= i -1; j++)
{
if (i % j == 0)
break;
}
if (j > i-1 )
{
n += 1;
Console.Write("{0}\t", i);
}
}
Console.WriteLine();
Console.WriteLine("统计共有:{0}个数", n);
Console.Read();