参考:
为什么比x小的素数能测试x是不是素数? - 知乎一个不是素数的数也就是合数,它可以是两个数的乘积,这两个数可以有很多种组合,但一定会有一种组合里的…
https://www.zhihu.com/question/377324304/answer/1251090453
示例代码:
/*
为什么比x小的素数能测试x是不是素数?
一个不是素数的数也就是合数,它可以是两个数的乘积,这两个数可以有很多种组合,但一定会有一种组合里的这两个数其中的一个数是素数。
那么为什么呢?因为如果把他们的两个数的组合再继续拆(如果可以的话),最后就会变成至少两个以上的不可再分的小乘积,这些乘积都是素数了,
随便取其中一个,再把其他小乘积乘其来成一个数,这两个数构成一个组合,那么就上面的结论就得证了。这样文字表述可能不够直观,直接举例拿组合比较多的24来说好了。
24组合随便举一个乘积组合4*6,4和6各自都是合数,它们再各自拆可以拆成2*2*2*3那么可以先取一个2,其他乘积为12也可以取一个3,其他乘积为8。
所以一个数是合数,那么除以这个合数之前的素数一定会有整除的,不能整除就是素数。
外加一句你是在看翁恺c语言吗的吗,它里面的却没讲为什么
作者:匿名用户
链接:https://www.zhihu.com/question/377324304/answer/1251090453
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
#include <stdio.h>
int isPrime(int x,int knownPrimes[],int numberofKnownPrimes); //函数的声明
int main()
{
const int number = 100; //定义常量
int prime[100]={2}; //先声明,c语言是不允许定义数组并且初始化时用变量代表其大小,但是c++可以,在.cpp文件中可以写成prime[number //表面prime数组有100大小 ,先填入第一个素数2,其余的先初始化为0;(若给出数组大小,不写则初始化为0)
int count = 1; //这里数组已经有一个素数了,所以计数为1
int i = 3; //从3开始判断
while (count < number){ //用循环,只要计数count还小于所定的数组大小,就继续循环
if (isPrime(i,prime,count)){ //这里是进入函数,然后函数返回值,如果返回1,则运行下面语句,让数组下标为1的位置填上该i,然后指向下一个下标2的位置,等2位置填上素数后
prime[count++] = i; //再指向下一个下标3的位置... (关于为什么是prime[count++] = i的解释;
}
i++; //然后累加,看4是不是素数
}
for (i=0;i<number;i++){
printf("%d",prime[i]);
if ( (i+1)%5) printf("\t"); //这里没什么好说的,就是把数组输出,每个数之间个一段距离,每5个数就换一行
else printf("\n");
}
return 0;
}
int isPrime(int x,int knownPrimes[],int numberofKnownPrimes)
{
int ret = 1; //这是结果,先假定为素数
int i;
for (i=0;i<numberofKnownPrimes;i++){ //这里的意思是循环,目前数组里面有几个素数,就循环几次,比如第一次进入,就1个素数,所以循环1次
if (x % knownPrimes[i]==0){ //如果在数组的素数表里找到能整除的素数,则表示x不是素数
ret = 0;
break;
}
}
return ret;
}