如何算出一个数的所有质数

如何算出一个数的所有质数,第1张

1、找到这个数字的平方根m=√m

2、找到不大于m的所有质数

3、在一张自然数表上划掉所有质数的整数倍(质数本身不划掉)

4、把1划掉。

5、没有划掉的数字就是质数。

例如,我们要找到100以内的所有质数,只需要按照下面的步骤进行:

1、计算100的平方根,是10。

2、10以内的质数有2、3、5、7

3、划掉2、3、5、7的整数倍。首先划掉2的倍数,如4、6、8…、98、100,然后划掉3的倍数,如6、9、12、15、…、99, 重复的就不需要再划掉了。然后划掉5的倍数,7的倍数。

4、最后划掉1。

扩展资料

质数与黎曼猜想

我们之前谈到:质数与黎曼猜想之间有着千丝万缕的联系。1896年,法国科学院举行比赛:征稿证明黎曼定理。两位年轻的数学家阿达马和德·拉·瓦莱布桑获得了这一殊荣。

实际上这两位数学家并没有证明黎曼猜想,只是获得了一点进展,但是这一点进展就一举证明了欧拉和勒让德的猜想,把素数猜想变成了素数定理。黎曼猜想的威力可见一斑。

1901年,瑞典数学家科赫证明:如果黎曼猜想被证实,那么素数定理中的误差项c大约是√xln(x)的量级。

即便黎曼猜想被证实,人们也只是在质数规律探索的过程中更近了一步,距离真正破解质数的规律,还有很长的路要走。也许质数就是宇宙留给人类的密码。

基本思路是对的。

从2到它本身减一的数一个一个算。少了一些东西,主函数后的花括号,还有循环里面的if语句什么都没有执行,printf也只能输出一个数,数字也没有定义。:帮你修改了一下……楼主看一看,我试过了可行的

#include<stdioh>

void main()

{

int i,m;

for(i=3;i<=100;i++)

{

for(m=2;m<i;m++)

{

if(i%m==0) break;/有被整除的数,提前退出,省时间也为后面做准备/

}

if(m==i) printf("%d ",i);/循环正常退出,说明找到了质数/

}

}

希望楼主采纳!

1000以内的话,每个数都不超过4位, 按照占5位或以上打印就行

printf("%5d",num);//位宽5, 前面添空格, 要左对齐的话,后面添,用%-5d

#include <stdioh>

#include <mathh>

int IsPrim(int n)

{

int i,j;

j=sqrt(n);

for(i=2;i<=j;i++)if(n%i==0)return 0;

return 1;

}

int main()

{

int i,n;

for(i=2,n=0;i<=1000;i++)

{

if(IsPrim(i))

{

printf("%-5d",i);

if(++n%5==0)printf("\n");

}

}

printf("\n");

return 0;

}

如果N是一个大于等于2的整数,并且只有1和N本身是它的因子,没有别的正因子,则称N是一个素数(质数)。

#include"stdioh"

main()

{

int i,n,num;

for(n=0,num=0;n<=300;n++)

{

i=2;

while(i<n&&n%i!=0)

i++;

if(i==n)

{

printf("%6d",n);

num++;

}

}

printf("n素数个数为%d",num);

}

别浪费了我的宝贵时间!

//#include "stdafxh"//If the vc++60, with this line

#include "stdioh"

#include "stdlibh"

int prime(int n){

    int i;

    if(n>2 && !(n&1) || n<2)

        return 0;

    for(i=3; ii<=n;i+=2)

        if(!(n%i))

            return 0;

    return 1;

}

int main(void){

    FILE fp;

    int np,n,x;

    if((fp=fopen("123txt","r"))==NULL){

        printf("Open the file failure\n");

        exit(0);

    }

    np=n=0;

    while(fscanf(fp,"%d",&x)>0){

        n++;

        if(prime(x))

            np++;

    }

    fclose(fp);

    printf("The result is %d:%d\n",np,n);

    return 0;

}

程序如下:

#include <stdioh>

main(){

  int i,j,ok;

  i=2;

  while(i<2000)

  {

    ok=1;

    j=2;

    while(ok==1 && j<i)

    {

      if (i%j==0) ok=0;

      j++;

    }

    if (ok==1) printf("%d\t",i);

    i++;

  }

}

运行结果如下:

2       3       5       7       11      13      17      19      23      29

31      37      41      43      47      53      59      61      67      71

73      79      83      89      97      101     103     107     109     113

127     131     137     139     149     151     157     163     167     173

179     181     191     193     197     199     211     223     227     229

233     239     241     251     257     263     269     271     277     281

283     293     307     311     313     317     331     337     347     349

353     359     367     373     379     383     389     397     401     409

419     421     431     433     439     443     449     457     461     463

467     479     487     491     499     503     509     521     523     541

547     557     563     569     571     577     587     593     599     601

607     613     617     619     631     641     643     647     653     659

661     673     677     683     691     701     709     719     727     733

739     743     751     757     761     769     773     787     797     809

811     821     823     827     829     839     853     857     859     863

877     881     883     887     907     911     919     929     937     941

947     953     967     971     977     983     991     997     1009    1013

1019    1021    1031    1033    1039    1049    1051    1061    1063    1069

1087    1091    1093    1097    1103    1109    1117    1123    1129    1151

1153    1163    1171    1181    1187    1193    1201    1213    1217    1223

1229    1231    1237    1249    1259    1277    1279    1283    1289    1291

1297    1301    1303    1307    1319    1321    1327    1361    1367    1373

1381    1399    1409    1423    1427    1429    1433    1439    1447    1451

1453    1459    1471    1481    1483    1487    1489    1493    1499    1511

1523    1531    1543    1549    1553    1559    1567    1571    1579    1583

1597    1601    1607    1609    1613    1619    1621    1627    1637    1657

1663    1667    1669    1693    1697    1699    1709    1721    1723    1733

1741    1747    1753    1759    1777    1783    1787    1789    1801    1811

1823    1831    1847    1861    1867    1871    1873    1877    1879    1889

1901    1907    1913    1931    1933    1949    1951    1973    1979    1987

1993    1997    1999

内的2,3,5,7的倍数(除2之外)去掉,就是所有质数啦

#include<iostream>

#include<cmath>

using namespace std;

int main(){

int i,j,sum=0,k=0;

bool flag=true;

for(i=2;i<=100;i++)

{

if(i==2 || (i%2!=0 && i%3!=0 && i%5!=0 && i%7 != 0) )

{

if(k%5==0)

cout<<endl; //每5个换一行

k++;

cout<<i<<" ";

sum += i;

}

}

cout<<endl;

cout<<"总和为:"<<sum<<endl;

return 0;

}

素数求法有很多种。。如果不要求时间暴力尝试是可以的。用算法的话个人认为还是用这个方法最快最好,就是把不是素数的数字排除,剩下的就是素数了。这个程序蛮简单的。。你看看能不能理解ps:这是我们acm培训的内容,很难得哦

void getprime(int n) //n是素数筛选区间

{

int i , j ;

bool flag[N];

memset ( flag , true , sizeof ( flag ) );

int count = 0; //记录找到的素数个数

for( i=2 ; i<=n ; i++ )

{

if ( flag[i] ) prime[++count]=i; //未被筛掉的就是素数

for( j=1 ; j<=count && iprime[j] <= n ; j++) // prime[j]表示第j个素数

{

flag[ iprime[j] ] = false; //iprime[j]表示被i筛掉的

if( i%prime[j]==0 ) break;

}

}

}

这个算法是一个很快的算法,详细的解释是举例:

i=6的时候,prime[ ]={2,3,5}

第一次6筛掉了62=12,然后判断6%2==2,break;假设循环没有break,接着6即将筛63=18,而事实上18是被9筛掉的。

统一化分析:

不妨设i=pr (p<r),执行break是因为i%p==0,故此时i筛掉的是x1=ip=(pr)p;如果i可以筛掉x1后面的数x2,x2=iq=(pr)q

由x2>x1-》q>p;那么x2可以写成x2=(qr)p,由于 qr>i ,所以x2一定可以被i之后某个数字(qr)筛掉,就不需要用i去筛掉。

以上就是关于如何算出一个数的所有质数全部的内容,包括:如何算出一个数的所有质数、用C程序求100以内的质数、求C语言程序设计:输出2~1000内所有质数。要求:输出每行5个数,数与数上下对齐!求解答啊~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9498447.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存