算法之美---1.素数问题

**

不管是求1到100的素数还是求100到200的素数其实就是 i 的数值变化而已,其他的没有任何差异,我们只要弄清素数的概念以及知道求素数的方法就可以。

###下面我以求100~200的素数为例示范一下过程和主要算法的思想。

**

  • 素数就是除了一和本身不能被其他的数整除,比如说,10就可以被2和5整除,那么10就不是素数,11这个数除了1和11之外,就没有其他的数一个除,所以11就是素数。下面我们来具体讲解一下例题,让大家有更深刻的认识。

方案1:

  • 第一种就是常规做法,设两个循环变量,i 和 j ,i 变量是遍历100到200之间的数,j 变量是遍历2到 i 变量的数,也可以理解为除数和被除数的关系,注意 j 的范围只遍历到 i 结束。先判断 i % j 余数是否为0,如果能整除就不是素数(例如 10%2==0),跳出循环,直到 j 的值增长到超过 i 了,说明 j 已经遍历了一遍,并且没有找到余数为0 的数,那么这个数就是素数,输出就可以了。
#include<stdio.h>
int main()
{
    int i=0,j=0;
    for(i=100;i<=200;i++){
        for(j=2;j<=i+1;j++){
            if(i%j==0){
                break;
            }
        }
        if(i==j){
                printf("i=%d\n",i);
            }
    }
    return 0;
}

方案2:

  • 第二种是对第一种的优化处理,需要用到 sqrt 函数,引入<math.h>头文件,如果一个数可以被1到本身整除,那么就要将2到本身的数遍历一遍,这样做大可不必,因为非素数可以写成除了1和它本身相乘的 a * b 方式,而 a、b 之间必有一个小于等于 a b 之积的开平方根。如果这个非素数能够被 a 整除,则相应的肯定可以被 b 整除。(例如10%2==0,2在根号10之内,所以只要遍历2到根号10就可以)
#include<stdio.h>
#include<math.h>
int main()
{
    int i=0,j=0;
    for(i=100;i<=200;i++){
        for(j=2;j<=sqrt(i);j++){
            if(i%j==0)
                break;
        }
        if(j>=sqrt(i)){
            printf("i=%d\n",i);
        }
    }
    return 0;
}

方案3:

  • 方案3是对方案2的优化,因为每个偶数都不是素数,所以我们只要对奇数进行遍历就好。
#include<stdio.h>
#include<math.h>
int main()
{
    int i=0,j=0;
    for(i=101;i<=200;i=i+2){
        for(j=2;j<=sqrt(i);j++){
            if(i%j==0)
                break;
        }
        if(j>=sqrt(i)){
            printf("i=%d\n",i);
        }
    }
    return 0;
}

此题仅仅是个人练题时查找资料的随手总结,如果有错误还请批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值