素数——也即质数,在大于1的自然数中,只能被1和自身整除的自然数。换个角度说也就是除了1和本身外,不能被任何整数整除的数
例如17就是素数,因为它不能被2~16的任一整数整除。
合数——与素数相对。
思路1:试除法
判断一个数n是否是素数,就是用n对2~n-1之间的每个数取余
#include <stdio.h>
#include <math.h>
#include <time.h>
int main (void)
{
clock_t begin, finish;
double duration;
int num = 0;
bool flag = 0;
int temp = 0;
num = 100;
scanf("%d", &num);
begin = clock();
if (num >= 2) {
printf("2 ");
}
for (int k = 3; k <= num; k++) {
if (k > 10) {
temp = (int)sqrt(double(k)) + 1;
} else {
temp = k;
}
for (int i = 2; i < temp; i++) { //(int)sqrt(double(k))
flag = 1;
if (k % i == 0) {
flag = 0;
break;
}
}
if (flag) {
printf("%d ", k);
}
}
printf("\n");
finish = clock();
duration = (double) (finish- begin);
printf("%f second\t", duration/CLOCKS_PER_SEC);
return 0;
}
思路2:
#include <stdio.h>
#include <math.h>
#include <time.h>
const int MAXN = 2000000;//这是0.95M 因为栈空间最大1M,所以数组最大长度不能超过1M(1024*1024/4),
int prime[MAXN] = {0};//数组定义在全局变量区,全局变量空间最大为1G
int main (void) {
clock_t begin, end;
double duration;
begin = clock();
//int prime[MAXN] = {0};//所占用的栈空间长度,int类型占4字节,1M是2^20字节,所以4*MAXN < 2^20
//所以MAXN < 1024*1024/4 = 2^18 = 262144,
//实际VC6.0编译器中最大只能是258683,通常取0.95M=249036或直接取250000
prime[0] = 2;
int k = 1;
for (int n = 2; n <= MAXN; n++) {
int top;
top= (int)sqrt(n*1.0)+1;//(double)n 也可以写成n*1.0 ,因为1.0在vc6.0中默认是double型的
bool flag = 1;
for (int i = 2; i < top; i++) {
if (n % i == 0) {
flag = 0;
break;
}
}
// for (int i = 0; i < k; i++) {
// if (n % prime[i] == 0) {
// flag = 0;
// break;
// }
// }
if (flag) {
printf("%d ", n);
prime[k] = n;
k++;
}
}
end = clock();
duration = (double)(end - begin) / CLOCKS_PER_SEC;
printf("\n%f second\n", duration);
return 0;
}
Algorithm
1、http://blog.csdn.net/dinosoft/article/details/5829550
2、http://blog.csdn.net/morewindows/article/details/7347459
3、http://coolshell.cn/articles/3738.html