打印100-200之间的素数

首先这个问题的核心其实就是如何判断一个数是否为素数

在我初次接触这个问题时,我觉得这个问题很简单,素数就是一个除了1和他本身,没有其他因数的数,我们只要用这个数去除以比他小的数(大于1),如果余数一直不为0,直到n-1(n即为这个数),那么就可以证明这是个素数

int main()
{
    int i;
    int n;
    int count = 0;
    for (n = 100; n <= 200;n++)
    {
        for (i = 2; i < n; i++)
        {
            if (n%i == 0)
                break;
        }
        if (i == n)
        {
            printf("%d ", n);
            count++;
        }

    }
    printf("\ncount=%d\n", count);
    return 0;
}

这个代码将问题解决了,于是我有点膨胀了,觉得自己又行了,然后才发现这个算法只能算是业余算法,因为对于一个数量级较大的数,这个算法无疑是计算量很大的,仔细想想发现,假设你这个素数是一个平方数,那么自然不用说你的平方根就是你的因数,但如果你不是平方数,那么如果你是合数,一定可以写成两个整数的乘积,而这两个数一定有一个大于你的平方根,有一个小于你的平方根,至于证明,可以用基本不等式,取等得最大,所以我们这里根本不用算所有的数,就算到平方根就可以了,优化代码如下。

int main()
{
    int i;
    int n;
    int count = 0;
    for (n = 100; n <= 200; n++)
    {
        for (i = 2; i < sqrt(n); i++)//此处用i/2也是没有问题的,因为sqrt(i)一定小于i/2
        {
            if (n%i == 0)
                break;
        }
        if (i > sqrt(n))
        {
            printf("%d ", n);
            count++;
        }

    }
    printf("\ncount=%d\n", count);
    return 0;
}

当然,当数足够大时,也可以用n/2,核心思想就是减小计算量,由于我还只是个小白,所以本篇文章的方法就这一种,有兴趣的读者可以去看一下《素数求解的n种境界》这篇文章,素数求解的n种境界-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值