我的代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int num=0;
for(int i=2; i<100; i++)
{
int zhishu = 1;
for(int j=2; j<=(int)sqrt(i); j++)
{
if(i%j==0)
{
zhishu = 0;
}
}
if(zhishu == 1){
printf("%d\n",i);
}
}
return 0;
}
/*
代码不够优越,有很多计算不优良的地方需要改进
如除2以外的偶数都不是质数
大于1的自然数,如果不是质数,可以分解成有限个质数相乘等
注意1既不是质数,也不是合数
*/
参考代码
#include <stdio.h>
#define Max 100 //定义全局变量
int num[Max/2],p=0;//定义存质数的表,p是素数表的下标
//因为1~100内,有一半偶数,一半奇数,偶数除2以外都不是质数,所以数组大小可定义为Max/2
int isPrime(int i){ //判断是否是质数函数
//唯一分解定理:任何一个大于1的自然数N, 如果N不为质数,那么N可以唯一分解成有限个质数的乘积
//如果L=m×n,则必有m≤根号L,n≥根号L
//如果根号L左边都没有L的因子,那右边也不会有,所以只需要看根号L左边的即可
//只看根号L左边:可以用m≤根号L,也可以用m×m≤L,后者更方便,不用考虑小数的处理
for(int j=0;num[j]*num[j]<=i;j++){ //只看根号i的左边是否有因子,这里也别忘记带等号<=,因为有25=5×5的情况
if(i%num[j]==0){//如果能整除,则是因子
return 0;
}
}
return 1;//否则,没有因子,就是质数
}
void gen_primes(max){ //寻找质数及数组处理函数
num[0]=2; //数组预处理,第一个质数是2,注意1既不是质数也不是合数
for(int i=3;i<=max;i+=2){ //质数除2以外都是奇数,所以可以i+=2
if(isPrime(i)) //判断该数是否为质数
num[++p]=i;//如果是,则扔进质数数组中
}
}
int main() //主函数,程序的入口
{
gen_primes(Max); //Max定义为了全局变量,仍作为参数放到函数中,是为了防止使用过程中不小心修改了全局变量
for(int i=0;i<=p;i++){ //打印质数数组,因为p是先加后用,所以取值时别忘了带等号<=
printf("%d\n",num[i]);
}
return 0;
}
总结:
1、质数(素数),是指在大于1的自然数(非负整数)中,除了1和它本身以外不再有其他因数的自然数。与质数相反的数是合数,1既不是质数也不是合数,除2以外的质数都是奇数
2、唯一分解定理:任何一个大于1的自然数N, 如果N不为质数,那么N可以唯一分解成有限个质数的乘积。例如:12=3×4=3×2×2;9=3×3。
3、L=m×n,则m≤根号L,n≥根号L,所以只需要看根号L左边的即可