找小于某一整数内的素数
来源:互联网 发布:paperpass 淘宝 编辑:程序博客网 时间:2024/05/17 01:55
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>/* * 求n以内的素数,并打印,反回素数的个数 * 主要算法为筛法 * 主要思想是: 素数的除1以外的倍数必然不是素数 * 将所有素数的倍数全部都"筛掉",那剩下的必然都是素数 */int print_prim(int n);/* * 求n以内的素数,并打印,反回素数的个数 * 主要算法为除法 * 主要思想是: 素数必然为除2以外的奇数,必然不可分解,如果一个数不是素数,那么它必然 * 可分解为两个不包括1的整数的乘积,并且这两个数中至少有一个数小于 * 这个数的开方根! */int print_prim2(int n);int main(int argc, char* argv[]){ int n = 100; if(argc == 2) n = atoi(argv[1]); print_prim(n); print_prim2(n); return 0;}//filter algrithomint print_prim(int n){ int next = 2; int i = next; int flag = 1; char* prim = (char*)malloc(n+1);//标志是否为素数 memset(prim, 1, n); int t = 1; int m = 0; //用于统计效率 while(next<=n) { //i*next 所有next的倍数必然不为素数,必然可分解为i*next for(i = next;(t=i*next)<=n;i++) { m++; prim[t] = 0; } next++; //找到下一个质数 for(i = next; i < sqrt(n); i++) { m++; if(prim[i] == 1) { next = i; break; } } } int count = 0; for(i = 1; i < n; i+=2) { if(prim[i] == 1) { printf("%d, ", i); count ++; } } printf("\n"); printf("filter efficiency = %d\n", m); return count;}int print_prim2(int n){ int t; int i = 1; int m = 0; //用于统计效率 int flag = 1; int count = 0; for(i = 1; i < n; i+=2) { flag = 1; int k = 2; t = sqrt(i); for(k = 2; k <= t; k++) { m++; if(i%k==0) { flag = 0; break; } } if(flag) { count ++; printf("%d, ", i); } } printf("\ndevide effeicency = %d\n", m); return count;}