1.素数

质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。

2.试除法

下面我给大家介绍一下素数求解常用的试除法,其核心思想就是判断大于1小于x之间的所有数是否可以被整除,如果可以为合数,否则为素数。

1.依次判断2~n-1之间的所有整数

#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int j = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
for (j = 2; j < i; j++)
{
if (i%j == 0)
{
break;
}
}
if (j == i)
{
printf("%d是素数\n", i);
count++;
}
}
printf("count=%d\n", count);
system("pause");
return 0;
}

2.由于素数为奇数,所以我们可以去除范围内的偶数

#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int j = 0;
int count = 0;
for (i = 101; i <= 200; i += 2)
{
for (j = 2; j < i; j++)
{
if (i%j == 0)
break;
}
if (j == i)
{
printf("%d是素数\n", i);
count++;
}
}
printf("count=%d\n", count);
system("pause");
return 0;
}

3.由于素数是只能被1和本身整除,且因数是成对出现的,所以我们只需要判断2~sqrt(n)之间的奇数即可

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <201; i += 2)
{
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i%j == 0)
{
break;
}
}
if (j>sqrt(i))
{
printf("%d是素数\n", i);
count++;
}
}
printf("count=%d\n", count);
system("pause");
return 0;
}

4.​除了2以外,所有可能的质因数都是奇数,先计算2,再计算3~i/2之间的所有奇数

#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int j = 0;
int count = 0;
for (i = 101; i <= 200; i += 2)
{
for (j = 2; j < i / 2; j++)
{
if (i%j == 0)
break;
}
if (j == i / 2)
{
printf("%d是素数\n", i);
count++;
}

}
printf("count=%d\n", count);
system("pause");
return 0;
}

3.筛选法

用筛法求​素数​的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的 数是素数,然后去掉它的倍数。依次类推,直到“筛子”为空时结束。如有: 1-100的数

1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,就是去掉4,6,8,10,12,14,16,18….
剩下的数中3最小,是素数,去掉3的倍数,就是去掉6,9,12,15,18,21,24.....
...
...
依次去掉2-10的倍数
直到所有的数都被筛完,求出的素数为: 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97

代码实现:

#include<stdio.h>
int main()
{
int a[101]={0}; //存储1-100
int i=0;
int j=0;
int k=0;
for(i=2;i<=10;i++) //从2-10作为最小值开始筛选
{
for(j=2;j*i<101;j++) //找出最小数的倍数
{
a[i*j]=1; //把最小数的倍数赋值1
}
}
for(k=2;k<101;k++) //因为1不是素数,所以从2开始遍历输出素数
{
if(a[k]==0) //在a数组中如果数组元素是0,那么相应下标就是素数
{
printf("%3d",k);
}
}
return 0;
}

利用函数实现:

#include<stdio.h>
void my_fun(int a[])
{
int i = 0;
int j = 0;
int k = 0;
for (i = 2; i <= 10; i++) //从2-10作为最小值开始筛选
{
for (j = 2; j*i<101; j++) //找出最小数的倍数
{
a[i*j] = 1; //把最小数的倍数赋值1
}
}
for (k = 2; k<101; k++) //因为1不是素数,所以从2开始遍历输出素数
{
if (a[k] == 0) //在a数组中如果数组元素是0,那么相应下标就是素数
{
printf("%3d是素数\n", k);
}
}
}
int main()
{
int a[101] = { 0 }; //存储1-100
my_fun(a);
return 0;
}