筛法求2~1000之间的所有素数

筛法求素数首先要建立筛子,这里利用数组作筛子。下标对应于数,相应下标变量的值标志是否在筛子中:为1表示在筛子中,为。表示已被筛去,不在筛子中。然后找每一轮筛选种子,筛选种子是完成一轮筛选后的下一个最小的素数,初值为2。

对每一轮筛选种子,筛去其所有倍数,即相应下标变量的值赋值为O。倍数初值为筛选种子的2倍。

筛选完成,筛子中剩下的即为素数。

程序如下:

/*程序8—14,筛法求2至1000之间的所有素数*/
main()
{
int a[1000];/*筛子数组*/
int i;
int minp,double;/*minp筛选种子,double倍数*/
int n=O;/*素数个数,用于输出格式控制*/
for(i=2;i<1000;i++)/*建立筛子*/

a[i]=1;
minp=2;/*筛选种子初始化*/
while(minp<500)/*完成整个筛选*/
{double=2*minp;/*倍数初始化*/
while(double<1000)/*完成一轮筛选*/
{a[double]=O;/*筛去当前倍数*/
double+=minp;/*计算下一个倍数*/
}
do/*计算下一轮筛选种子*/
{minp++;}
while(a[minp]==0);
}

printf("2至1000之间的所有素数如下:\n");
for(i=2;i<1000;i++)
if(a[i]==1)
{printf("%6d",i);
n++;
if(n%5==0)printf("\n");/*5个素数输出在一行*/
}

}

时间: 2024-10-03 08:44:27

筛法求2~1000之间的所有素数的相关文章

求1O~1000之间的回文数

一个数是不是回文数,先将其数字分离,用一数组a存放,然后将相应数字进行比较.为此引入一标志变量flag,其值为1表示是回文数,为0表示不是回文数. 程序如下: /*程序8-1S,求lO~1000之间的回文数*/ main() {int i,X: int a[8],j: int b,e: int flag; for(i=10; i<1000l i++) {j=O:x=i;/*将数字分离,用一数组存放*/ while(x>O) {a[j]=x%10; x/=1O: j++: } flag=1:/*

JAVA 求1~1000之间的连数相加

问题描述 例如:3=1+2,15=7+8,100=18+19+20+21+22.求1000以内有多少这样的数,分别是哪些数? 解决方案 解决方案二:题目描述的不清楚,3=1+2算的话,那1+2=3呢?3+4=7呢?1+2+3+4=10呢?解决方案三:确实啊没说清楚按lz的意思5=2+37=3+49=4+5....那么至少所有奇数都能成立啊解决方案四:楼主的意思是不是说:连续的数字相加等于1~1000之内的数,这样的组合有多少个?解决方案五:100内的,把100都改成1000看看是不是你要求的pu

java-JAVA 我想在10到1000之间打印各个数位之和为5的数字,这样写有什么错,新手求大神指点

问题描述 JAVA 我想在10到1000之间打印各个数位之和为5的数字,这样写有什么错,新手求大神指点 public class Demo1 { public static void main(String []args){ int n=10; int t=n; int sum=0; while(t<=1000) { t++; sum=sum+t%10; t=t/10; } if(sum==5) { System.out.println(""各个数位之和为5的有:"&q

acm-区间筛法求区间内素数的个数

问题描述 区间筛法求区间内素数的个数 for(ll i = 2;i*i <=b;i++) is_prime_small[i] = true; for(ll i = 0;i <=b-a;i++) is_prime[i] = true; for(ll i = 2;i*i <=b;i++) { if(is_prime_small[i]) { for(ll j = 2*i;j*j <=b;j += i) is_prime_small[j] = false; for(ll j = max(2

求解答!c++中自动随机产生100个在0~1000之间的整数并排序为什么会出现只产生50个数???

问题描述 求解答!c++中自动随机产生100个在0~1000之间的整数并排序为什么会出现只产生50个数??? #include #include #include using namespace std; void bubble_up(int list[],int count) { for(int i=0;i for(int j=count-1;j>1;j=j-1) if(list[j-1]>list[j]) { int tmp=list[j-1]; list[j-1]=list[j]; li

[经典面试题]给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数

[题目] 给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数 ---------百度校招 [分析] 1.对于给定的N,我们可以用筛法求素素数的方法在O(n)的时间复杂度内求出所有的素数. 2.除2之外,所有的素数相加都为偶数,所以求出6~N之间的素数,打印两两的和就可以,时间复杂度O(n^2) [代码] #include <iostream> #include <cstring> #include <algorithm> using namespa

如何用线性筛法求欧拉函数

前几天做了一个关于欧拉函数的题,当时就做超时了,因为我是暴力做的,后来百度了一下 线性晒法求欧拉函数,所以今天就打算系统的看一下筛法求欧拉函数的问题,该算法在可在线性时间内筛素数的同时求出所有数的欧拉函数: 先介绍一下暴力的欧拉函数: Eular(m) = m - (1-1/p1) - (1-1/p2) - ... - (1-1/pk)  [其中 p1, p2...pk为m的素因子] int Eular(int m) { int ret = m; for(int i=2; i<m; i++) {

根据坐标求出1000公里内的所有省,市的名称

问题描述 已知一个坐标,怎样求出1000公里内的所有省份,市的名称,百度地图有这样的API吗 解决方案 解决方案二:由经纬度查询地址是有,解决方案三:这个问题在ask.csdn.net回答过你了.解决方案四:你应该建立一个数据库,里面存放的全国省市名称和该城市坐标.给定的点和数据库里的坐标用2点之间距离公式计算即可(计算距离需要把°转为米,可以自己搜一下经度/维度具体比例数值,记忆中两者都在每°10万米-11万米左右)解决方案五:如果采用外部的地图API,请参考提供商的接口.如果你本地有地图的信

判断101-200之间有多少个素数,并输出所有素数。 没有输出

问题描述 判断101-200之间有多少个素数,并输出所有素数. 没有输出 for (int i = 101; i <=200; i++) { for (int j = 2; j < j/2; j++) { if (i % j == 0) { System.out.println(i + ""是素数""); } } } 这个怎么没有输出呢,我的代码应该没问题吧 解决方案 for (int j = 2; j < j/2; j++) {改成 for (i