C语言::打印100-200之间的素数

来源:互联网 发布:男士休闲单肩包 知乎 编辑:程序博客网 时间:2024/05/19 02:05

题目要求

编写一个C语言程序,要求打印100~200之间的素数

算法分析

在C语言程序中,我们要想打印100-200之间的素数,首先我们得判断该数是不是素数.

判断素数的算法,有位大神写过这样一篇文章,我就不在详细赘述了。

求质数算法的N种境界

在此,我仅简单的总结归纳一下.

算法总结

境界一:假设要判断n是否为素数,就从2一直试除到n-1.

境界二:从2开始一直试除到n/2.

境界三:从2开始,然后是3、5、7、9....,一直试除到n/2.

境界四:从2开始一直试除到√n(根号n).

境界五:除以小于n的素数.

PS:境界四与境界五平级

算法转程序

境界一的实现

因为要从2一直试除到n-1,所以这里一定要用循环进行操作.

一想到循环,我们第一时间应该想到的是:循环的条件是什么?

而在本题中,循环条件非常明显,即:循环变量小于n.

因此,境界一的代码片段如下:

int IsPrimeNumber(unsigned int n){    //定义一个循环变量并初始化为0     unsigned int i = 0;    //如果n小于2,n一定不是素数    if(n<2){        //返回0         return 0;    }    //让循环变量从2开始,    //当循环变量小于n时,进入循环,    //每次循环后,循环变量自增1.     for(i=2;i<n;i++){        //如果n能够整除2-n内的某个值        if((n%i)==0){            //返回0            return 0;        }    }    //如果程序能执行到这里,    //说明n一定为素数    //返回1     return 1;}

境界二的实现

与境界一类似,区别仅仅是将循环条件改为了n/2

境界二的代码片段如下:

int IsPrimeNumber(unsigned int n){    //定义一个循环变量并初始化为0     unsigned int i = 0;    //如果n小于2    if(n<2){        //返回0         return 0;    }    //让循环变量从2开始,    //当循环变量小于n/2时,进入循环,    //每次循环后,循环变量自增1.     for(i=2;i<n/2;i++){        //如果n能够整除2-n内的某个值        if((n%i)==0){        //返回0            return 0;        }    }    //如果程序能执行到这里,    //说明n一定为素数    //返回1     return 1;}

境界三的实现

与境界一想比不仅将循环条件改为了n/2,循环后的调整部分也略有改动.

境界三代码如下:

int IsPrimeNumber(unsigned int n){    //定义一个循环变量并初始化为0     unsigned int i = 0;    //如果n小于2    if(n<2){        //返回0         return 0;    }    //让循环变量从2开始,    //当循环变量小于n/2时,进入循环,    //除了第一次循环,循环变量自增1之外    //其余每次循环后,循环变量都自增2     for(i=2;i<n/2;i==2?i++:i+=2){        //如果n能够整除2、3、5、7、9、11、13...n/2内的某个值        if((n%i)==0){        //返回0            return 0;        }    }    //如果程序能执行到这里,    //说明n一定为素数    //返回1     return 1;}

境界四的实现

与境界一类似,也仅仅是修改循环条件为√n.

境界四代码如下:

int IsPrimeNumber(unsigned int n){    //定义一个循环变量并初始化为0     unsigned int i = 0;    //如果n小于2    if(n<2){        //返回0         return 0;    }    //让循环变量从2开始,    //当循环变量小于√n时,进入循环,    //每次循环后,循环变量自增1    for(i=2;i<=(int)sqrt(n);i++){        if((n%i)==0){        //返回0            return 0;        }    }    //如果程序能执行到这里,    //说明n一定为素数    //返回1     return 1;}

境界五的实现

因为,境界五需要一个连续的素数序列.(2、3、5、7、11、13...)
而本题要求打印100-200之间的素数.
出于效率,境界五不适合本题,因此省略.

完整版代码

最终的代码,就以在试除法中,性能相对优越的境界四,来作为核心内容.
完整版代码如下:

#include<stdio.h>#include<math.h>//声明函数 int IsPrimeNumber(unsigned int n);int main(){    //定义一个循环变量并初始化     int i = 0;    //定义一个计数器并初始化    int count = 0;     //通过循环变量来提供100-200的数据    printf("100-200之间的素数有:\n");    for(i=100; i<=200; i++){        //如果i是素数         if(IsPrimeNumber(i)){            printf("%d ",i);            count++;        }    }    printf("\n合计共有%d个",count);    return 0;}int IsPrimeNumber(unsigned int n){    //定义一个循环变量并初始化为0     unsigned int i = 0;    //如果n小于2    if(n<2){        //返回0         return 0;    }    //让循环变量从2开始,    //当循环变量小于√n时,进入循环,    //每次循环后,循环变量自增1    for(i=2;i<=(int)sqrt(n);i++){        //如果n能整除i时        if((n%i)==0){        //返回0            return 0;        }    }    //如果程序能执行到这里,    //说明n一定为素数    //返回1     return 1;}

最后祝大家一切安好! ——高小调

原文地址:C语言::打印100-200之间的素数

(如欲转载,请联系高小调博客授权)

0 0
原创粉丝点击