素数的分布规律一直是数学难题,但是我们可以用计算机的强大算力进行探究。
问题1:判断输出的数是否是一个素数。
最简单的方法,即是看比它小的数是否能够整除它。代码如下:
#include<stdio.h>
int main()
{
int n, i, condition = 0; //设定初值为0的condition作为判定条件
printf("请输入一个正整数\n");
scanf("%d", &n);
if (n == 1)//排除特殊情况
{
printf("不是素数\n");
return 0;
}
for (i = 2; i<=(n / 2) ; i++)//历遍可能是因子的i
{
if (n % i == 0)
{
condition = 1;
break;
}
}
if (condition == 0)//没有除1与本身外的其他因子
printf("是素数\n");
else
printf("不是素数\n");
return 0;
}
输入:13 输出:是素数
输入:14 输出:不是素数
问题2:输出前n个素数。
上述的方法,需要历遍的可能的因子较多。当需要一次进行多个素数的判断时,效率较低。
对此问题我们简化计算,即只需判断比这一正整数小的全部素数是否可以整除它即可,由此构造数组,用已填入数组的数检测新数,是素数即填入数组。代码如下:
#include<stdio.h>
#define MAX_SIZE 1000
int main()
{
int n,i,j,m,a[MAX_SIZE],flag=1;//n为数组元素个数
//m为新加入的数(素数)
//设定flag为判定条件
scanf("%d", &n);
a[0] = 2; //2一定是第一个素数
if(n>1)
for(i=1;i<=n-1;i++)//开始填入第二到第n个数
{
for (m = 3;; m++)
{
for (j = 0; j <= i - 1; j++)
if (m % a[j] == 0) //判断m是否会被已填入的素数整除
flag = 0;
if (flag == 1)
{
a[i] = m; //得到新的素数m,将其填入
break; //记得终止循环
}
flag = 1; //记得将flag归为初值
}
}
for (i = 0; i <= n - 1; i++)
printf("%d ", a[i]);
return 0;
}
输入:10
输出: 2 3 5 7 11 13 17 19 23 29