筛法--求1到100的所有素数

用筛法求出100以内的全部素数,并按每行五个数显示

从1开始每次判断一个数是否为素数,如果为素数,就把所有能被这个数整除的数排除,即不是素数

首先是一个判断素数的函数

 1 bool sushu(int x)
 2 {
 3     if (x==2)
 4     return true;
 5     for (int i = 2;i <= sqrt(x);i++)
 6     {
 7         if (x%i==0)
 8             return false;
 9     }
10     return true;
11 }

把能被素数整除得数排除

 1     for (int i = 2;i <= sqrt(n);i++)
 2     {
 3         if (sushu(i))
 4         {
 5             for (int j= 2;j <= n/i;j++)
 6             {
 7                 a[i*j]=false;
 8             }
 9         }
10     }

完整代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <math.h>
 5 #include <algorithm>
 6 #include <iomanip>
 7 using namespace std;
 8 bool sushu(int x)
 9 {
10     if (x==2)
11     return true;
12     for (int i = 2;i <= sqrt(x);i++)
13     {
14         if (x%i==0)
15             return false;
16     }
17     return true;
18 }
19 int main()
20 {
21     int const n = 100;
22     bool a[10000];
23     memset(a,true,sizeof(a));
24     a[1]=false;
25     for (int i = 2;i <= sqrt(n);i++)
26     {
27         if (sushu(i))
28         {
29             for (int j= 2;j <= n/i;j++)
30             {
31                 a[i*j]=false;
32             }
33         }
34     }
35     int ans=0;
36     for(int i = 1;i <= n;i++)
37     {
38         if (a[i]){
39             printf ("%-5d",i);
40             ans++;
41         }
42         if (ans==5)
43         {
44             ans=0;
45             cout<<endl;
46         }
47     }
48     return 0;
49 }

原文地址:https://www.cnblogs.com/very-beginning/p/11991614.html

时间: 2024-10-09 20:04:47

筛法--求1到100的所有素数的相关文章

求1到100以内的素数(质数)

在我还没有学习JAVA之前我被一个还上初中的兄弟问到:一百以内有多少个质数,分别都是几呢,它们的和是多少?.虽然我们都知道质数的概念:质数又称素数,是指一个大于1的自然数中,除了1和其自身外,没法被其他自然数整除的数.我当时蒙圈了,都是哪些数字嘛我还能一一说出来,至于多少个嘛,数一数就好了.可是求和就浪费时间了. 后来身为小白的我刚接触JAVA这个行业,我也遇到求素数的题目.发现我在网上搜索答案的时候发现一些代码没有优化就提交了.我学习JAVA也有一个来月了,回头再看看我写的代码感觉效率好慢也是

孪生素数(用筛法求素数)

所谓孪生素数指的就是间隔为 2 的相邻素数,它们之间的距离已经近得不能再近了, 就象孪生兄弟一样.最小的孪生素数是 (3, 5), 在 100 以内的孪生素数还有 (5, 7), (11, 13), (17, 19), (29, 31), (41, 43), (59, 61) 和 (71, 73),总计有 8 组. 但是随着数字的增大,孪生素数的分布变得越来越稀疏,寻找孪生素数也变得越来越困难. 那么会不会在超过某个界限之后就再也不存在孪生素数了呢? 孪生素数有无穷多对!这个猜想被称为孪生素数猜

Eratosthenes,筛法求素数

//筛法求区间[0,n]的所有素数,v为素数表 //v[i]==0,i为素数 void f(int n) { int m=sqrt(n+0.5); memset(v,0,sizeof(v)); for (int i=2;i<=m;i++) if (!v[i]) for (int j=i*i;j<=n;j+=i) v[j]=1; }

Algorithm --&gt; 筛法求素数

一般的线性筛法 genPrime和genPrime2是筛法求素数的两种实现,一个思路,表示方法不同而已. #include<iostream> #include<math.h> #include<stdlib.h> using namespace std; const int MAXV = 100; //素数表范围 bool flag[MAXV+1]; //标志一个数是否为素数 int prime[MAXV+1]; //素数表,下标从0开始 int size=0; //

poj 2689 Prime Distance 【数论】【筛法求素数】

题目链接:传送门 题目大意: 给你L和R两组数,L和R的范围是2^32,其间隔(即R-L最大为1,000,000.) .让你求出L和R之间素数的最大间隔和最小的间隔. 比如 2 17.之间的最小素数间隔是2 3,最大的素数间隔是11 17. 要是直接进行一个2^32次方筛法然后在判断是会T的. 我们这样来想,筛法求素数的原理是什么: /**vis数组标记为0则说明是素数*/ int vis[10005]; void getPrimevis(int n) { int m=sqrt(n+0.5);

蓝桥杯 算法训练 Torry的困惑(基本型)(水题,筛法求素数)

算法训练 Torry的困惑(基本型) 时间限制:1.0s   内存限制:512.0MB 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7--这样的数叫做质数.Torry突然想到一个问题,前10.100.1000.10000--个质数的乘积是多少呢?他把这个问题告诉老师.老师愣住了,一时回答不出来.于是Torry求助于会编程的你,请你算出前n个质数的乘积.不过,考虑到你才接触编程不久,Torry只要你算出这个数模上50000的值. 输入格式 仅包含一个正整数n,其中n<=100

hdu 4548 筛法求素数 打表

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4548 Problem Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数. 给定一个区间,你能计算出这个区间内有多少个美素数吗? Input 第一行输入一个正整数T,表示总共有T组数据

[转载]基础算法——筛法求素数

以下来自http://blog.csdn.net/stack_queue/article/details/53560887 求素数是程序设计比赛中经常遇到的问题,最基本的方法是通过素数的定义直接判断,只能被1和它本身整除的数就是素数了.这种方法适合判断单个数是否为素数,当要求一个范围内素数而这个范围又比较大时,这种方法就不太使用了,甚至程序要运行几分钟才能算出结果. 筛法的思想是去除要求范围内所有的合数,剩下的就是素数了,而任何合数都可以表示为素数的乘积,因此如果已知一个数为素数,则它的倍数都为

求100之内的素数

题目:求100之内的素数 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数. 1 package com.li.FiftyAlgorthm; 2 3 /** 4 * 题目:判断101-200之间有多少个素数,并输出所有素数. 5 * 程序分析:判断素数的方法:用一个数分别去除2得到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数. 6 * @author yejin 7 */ 8 public class Prime