永发信息网

c程序求素数

答案:3  悬赏:70  手机版
解决时间 2021-03-03 10:49
用c程序求100-300间所有的素数
最佳答案
#include
#include

int f(int n) //起到判断大于1的正整数是否为素数的作用,返回一个值以标识,是则返回1,否则返回0。
{
int i;
for(i=2;i<=sqrt(n);i++)
if(n%i==0)
return 0;
return 1;
}

int main()
{
printf("100至300之间的素数从小到大分别为:\n");
int i,k=0;
for(i=100;i<=300;i++)
if(f(i))
{
k++;
printf("%d\t",i); //符号“\t”的作用是横向制表。
}
printf("\n总共%d个。\n",k );
return 0;
}
全部回答
授之以鱼不如授之以渔: 思想: 【1】求10000以内的所有素数。 素数是除了1和它本身之外再不能被其他数整除的自然数。由于找不到一个通项公式来表示所有的素数,所以对于数学家来说,素数一直是一个未解之谜。像著名的 哥德巴赫猜想、孪生素数猜想,几百年来不知吸引了世界上多少优秀的数学家。尽管他们苦心钻研,呕心沥血,但至今仍然未见分晓。 自从有了计算机之后,人们借助于计算机的威力,已经找到了2216091以内的所有素数。 求素数的方法有很多种,最简单的方法是根据素数的定义来求。对于一个自然数N,用大于1小于N的各个自然数都去除一下N,如果都除不尽,则N为素数,否则N为合数。 但是,如果用素数定义的方法来编制计算机程序,它的效率一定是非常低的,其中有许多地方都值得改进。 第一,对于一个自然数N,只要能被一个非1非自身的数整除,它就肯定不是素数,所以不 必再用其他的数去除。 第二,对于N来说,只需用小于N的素数去除就可以了。例如,如果N能被15整除,实际 上就能被3和5整除,如果N不能被3和5整除,那么N也决不会被15整除。 第三,对于N来说,不必用从2到N一1的所有素数去除,只需用小于等于√N(根号N)的所有素数去除就可以了。这一点可以用反证法来证明: 如果N是合数,则一定存在大于1小于N的整数d1和d2,使得N=d1×d2。 如果d1和d2均大于√N,则有:N=d1×d2>√N×√N=N。 而这是不可能的,所以,d1和d2中必有一个小于或等于√N。 基于上述分析,设计算法如下: (1)用2,3,5,7逐个试除N的方法求出100以内的所有素数。 (2)用100以内的所有素数逐个试除的方法求出10000以内的素数。 首先,将2,3,5,7分别存放在a[1]、a[2]、a[3]、a[4]中,以后每求出一个素数,只要不大于100,就依次存放在A数组中的一个单元 中。当我们求100—10000之间的素数时,可依次用a[1]-a[2]的素数去试除N,这个范围内的素数可以不保存,直接打印。 【2】用筛法求素数。 简单介绍一下厄拉多塞筛法。厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2-N的各数写在纸上: 在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于 N的素数。 这很像一面筛子,把满足条件的数留下来,把不满足条件的数筛掉。由于这种方法是厄拉多塞首先发明的,所以,后人就把这种方法称作厄拉多塞筛法。 在计算机中,筛法可以用给数组单元置零的方法来实现。具体来说就是:首先开一个数组:a[i],i=1,2,3,…,同时,令所有的数组元素都等于下标 值,即a[i]=i,当i不是素数时,令a[i]=0 。当输出结果时,只要判断a[i]是否等于零即可,如果a[i]=0,则令i=i+1,检查下一个a[i]。 筛法是计算机程序设计中常用的算法之一。 【3】用6N±1法求素数。 任何一个自然数,总可以表示成为如下的形式之一: 6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…) 显然,当N≥1时,6N,6N+2,6N+3,6N+4都不是素数,只有形如6N+1和6N+5的自然数有可能是素数。所以,除了2和3之外,所有的素数都可以表示成6N±1的形式(N为自然数)。 根据上述分析,我们可以构造另一面筛子,只对形如6 N±1的自然数进行筛选,这样就可以大大减少筛选的次数,从而进一步提高程序的运行效率和速度。 在程序上,我们可以用一个二重循环实现这一点,外循环i按6的倍数递增,内循环j为-1和1的循环,则i+j恰好就是形如6N±1的自然数。
#include "stdio.h" void main() { int n = 0,w = 1,i = 2; scanf("%d",&amp;n); while(i &lt;= (n-1) &amp;&amp; w == 1){//这里你应该用逻辑与,你使用逗号就成了逗号运算符。而且在c里面“=”是赋值号,不是等于的意思,你这个程序里很多地方用了赋值号代替等于号。 if(n%i == 0){ w = 0; }else{ i = i+1; } } if(w == 1){ printf("%d是素数\n",n); }else{ printf("%d不是素数\n",n); } } 这个程序有很多地方被我改了。呵呵,其实你写的那个程序主要的问题就是赋值号与等号的写法。其他地方没什么问题,你可以自己改你的原程序试试。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
铜山县柳新镇孙庄村民委员会我想知道这个在什
下列关于地球自转和公转的说法,正确的是A.
3x-4(2x+5)=x+4
火钱梁在什么地方啊,我要过去处理事情
求一款电子教室软件,使用平台:安卓4.0系统
wow蛋总双刀叫什么
希望宝宝有哪些婴儿产品啊?
英语句法We all want to be made man of.不太
十四画补火的繁体字
风云招待所在哪里啊,我有事要去这个地方
妮可曼妮婚纱展厅在哪里啊,我有事要去这个地
私募基金一定要去基金协会备案吗
天津新生儿医保怎么办理
天龙八部里面王语嫣的表哥学的功夫是啥呢?
在半径为R的固定半球形碗内,有一质量为m的物
推荐资讯
环卫监察属于全额事业编制、差额事业编制和自
他发问我在干嘛,怎么回他? 他说他今天很累
哪些动词是v+doing 用法?
桓台县动物卫生监督所起凤分所我想知道这个在
马天宇在古剑奇谭中饰演的哪个角色
华为mate7背面凹陷部位是什么
吃什么食物可以快速降血压? 比如给一些老人
擎天宾馆地址有知道的么?有点事想过去
在韩国一千万韩币能干嘛(⊙o⊙?)
千山万水总是情 聚散也有天注定 什么意思?
不知道叶黄素在哪里有?
做指卧撑对手指有害吗?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?