C语言 输出100以内的质数

我的代码

#include 
#include 
#include 
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 
#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左边的即可
 

你可能感兴趣的:(c语言,算法)