题目:求1~N范围中的素数。k为当前数值,j为被除数
素数:一个大于1的自然数中,除了1和本身外无法整除其余数的数值。
- 对于素数,可以忽略双数部分,因为均能被2整除,2也是素数做特殊情况,直接输出,即除去双数的可能,数据减少一半,即执行效率要提高一倍,k初始化为3,k=k+2。
- 因为k只可能为单数,所有被除数可忽略双数,被除数 j 初始化为3,每次 j += 2。
- 对于判断, 因为不是质数,那么一定可以表示成两个数(除了1和它本身)相乘,这两个数必然有一个小于等于它的平方根。只要找到小于或等于的那个就行了,用当前数值从3开始至当前数值的开根范围的数求余数,运行效率再次提高。
- 对于余数不等于0且 j 小于当前数值的开根值的情况,循环执行被除数 j += 2,若被除数 j 大于开根植,则当前数值为素数。
- 对于余数==0的情况,表示不是素数。
具体实现代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void get_prime(char *s)
{
int N = atoi(s);
int j = 3;
double k = 3.0;
int n = 1;
//2为特殊的素数
printf("%d\t",2);
//从3开始到N,依次找出素数
while((int)k < N)
{
j = 3;
//被除数小于当前数值的开根,且不能整数的情况
while( j < sqrt(k) && ((int)k % j != 0) )
{
j += 2;//k不等于双数,被除数也可忽略双数部分数值
}
//如果一直到j大于开根值都不能整除则为素数
if( j >= sqrt(k) )
{
printf("%d\t", (int)k);
n++;
if(n%5 == 0)
printf("\n");
}
k += 2;
}
printf("\n");
}
int main(int argc, char **argv)
{
printf("求1~%s的素数:\n",argv[1]);
get_prime(argv[1]);
return 0;
}