筛法求小于等于整数n的所有质数
2009-02-13 22:03
218 查看
筛法求n以下的质数最核心的是确定其倍数未消去的最大数p应该满足的条件。要消去q的倍数,最小应该从q*q考察起(因为其他跟小的倍数已经由2p,3p。。。(p-1)*p消去了) 那么消去q的倍数只需从q*q开始 到n结束(满足不等式q*q <=n).
以下是测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define Maxsize 25
// 筛法求n以内的素数
void sieve(int a[],int n)
{
int i,j,m,s=0;
int k = (int)sqrt(n);
for(i = 1; i <= k ; i++)
{
if(a[i] != 0)
{
j=a[i]*a[i];
while(j <= n)
{
a[j-1] = 0; //将该元素的标记标为零
j = j + a[i];
}
}
}
for(m = 0 ; m < n ; m++) //打印筛选出来的质数
{
if(a[m] >= 2)
{
printf("%d ",a[m]);
s++;
}
}
printf("/n");
printf("%d/n" , s); //输出筛选质数个数
}
void main()
{
int i;
int array[Maxsize];
for(i = 0 ; i < Maxsize; i++)
array[i] = i+1; //将数组赋值为1...n
sieve(array,Maxsize);
}
以下是测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define Maxsize 25
// 筛法求n以内的素数
void sieve(int a[],int n)
{
int i,j,m,s=0;
int k = (int)sqrt(n);
for(i = 1; i <= k ; i++)
{
if(a[i] != 0)
{
j=a[i]*a[i];
while(j <= n)
{
a[j-1] = 0; //将该元素的标记标为零
j = j + a[i];
}
}
}
for(m = 0 ; m < n ; m++) //打印筛选出来的质数
{
if(a[m] >= 2)
{
printf("%d ",a[m]);
s++;
}
}
printf("/n");
printf("%d/n" , s); //输出筛选质数个数
}
void main()
{
int i;
int array[Maxsize];
for(i = 0 ; i < Maxsize; i++)
array[i] = i+1; //将数组赋值为1...n
sieve(array,Maxsize);
}
相关文章推荐
- 【LeetCode 233】所有小于等于n的整数中,1出现的总次数,(例如111算3次)
- 获取一个整数 然后显示所有小于或等于该数的素数
- c语言:实现对于给定的正整数N,依次打印出小于等于N的所有素数。两种方法及其优化
- 输出所有小于等于n(n为一个大于2的正整数)的素数
- 求大于等于第一个数而且小于等于第二个数的所有的质数的和
- 用户输入一个整数,然后显示所有小于或等于该数的素数!
- 输入任意一个大于2的正整数n,输出所有小于等于n的素数
- C primer plus 第七章 练习9: 编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。
- 小于等于N的所有整数与N关于gcd(i,N)的那些事
- 程序员面试题精选(44):整数分割(即求一个数N由小于等于N的数相加所得的所有组合)
- 接受一个整数输入,显示所有小于或等于该数的素数
- 20171207编写一个程序,只接受正整数的输入,然后显示所有小于或等于该数的素数。
- c语言:实现对于给定的正整数N,依次打印出小于等于N的所有素数。两种方法及其优化
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- Windows平台下GCC编程之打印所有的“水仙花数”,所谓“水仙花数”是指一个三位正整数,其各位数字的立方和等于该数本身。
- 动态规划实现:给定整数m , 取若干个1到n的整数可求和等于整数m,编程求出所有组合的个数。
- 一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数,使其和等于m ,要求将其中所有的可能组合列出来.
- 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
- 输入两个整数 n 和 m,从数列1,2,3…….n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来