判断一个数是否为质数4种方法

首先理解什么是质数:

素数就是质素,只能被1它本身整除的数字。

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数

最小的质数为2;

判断一个数是否为素数,要在2~i-1的数字去试除。如果i被整除,就说明i不是素数。如果2~i-1之间的数字都不能整除i,说明i是素数。

假设要计算100——200之间的素数

一.

#include<stdio.h>
int main()
{
    int i = 0;
    for (i = 100; i <= 200; i++)
    {
        int j = 0;
        for (j = 2; j < i; j++)
        {
            if (i % j == 0)
            {
                break;
            }
        }
        if (i==j)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

第一种方法是最容易想到和理解的;

 二.

#include<stdio.h>
int main()
{
    int i = 0;
    for (i = 100; i <= 200; i++)
    {
        int flag = 1;//假设i为素数,定义一个标记,flag=1,则i为素数
        int j = 0;
        //判断i是否为素数
        for (j = 2; j < i; j++)
        {
            if (i % j == 0)
            {
                flag = 0;//被整除,可以被除尽,说明i不是素数
                break;
            }
        }
        if (1==flag)/i不能被整除则说明i是素数,如果if(1==flag)可执行,说明i是素数
        {
            printf("%d ", i);
        }
    }
    return 0;
}

三.

c=a*b      a和b中至少有一个数是小于等于开平方c

//16=2*8=4*4

sqrt函数是开平方函数

#include<stdio.h>
#include <math.h>
int main()
{
    int i = 0;
    for (i = 100; i <= 200; i++)
    {
        int flag = 1;
        int j = 0;
        for (j = 2; j < sqrt(i); j++)
        {
            if (i % j == 0)
            {
                flag = 0;
                break;
            }
        }
        if (1==flag)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

 四.质数肯定不能被2整除,所以for循环结构可以优化

#include<stdio.h>
#include <math.h>
int main()
{
    int i = 0;
    for (i = 100; i <= 200; i+=2)
    {
        int flag = 1;
        int j = 0;
        for (j = 2; j < sqrt(i); j++)
        {
            if (i % j == 0)
            {
                flag = 0;
                break;
            }
        }
        if (1==flag)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

 

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
除了试除法,判断一个数是否为素数还有其他的方法,下面介绍几种常用的方法。 1. 质数筛选法 质数筛选法是一种较为常见的素数判断方法,其思想是先将待判断的数列出一些小于等于它的质数,然后判断该数是否能被这些质数整除。具体实现可以采用埃式筛法或欧拉筛法等,时间复杂度均为 O(nloglogn)。 2. Fermat测试 Fermat测试是一种基于费马小定理的素数测试方法,其原理是:如果 p 是素数,且 a 是小于 p 的正整数,则 a^(p-1) mod p = 1。因此,我们可以随机选取一些 a 值,进行计算,如果不等于 1,则 p 不是素数。如果等于 1,则 p 可能是素数,需要进行多次测试以提高准确性。 需要注意的是,Fermat测试对于一些合数也可能返回为素数,因此需要多次测试以提高准确性。 3. Miller-Rabin算法 Miller-Rabin算法是一种基于Fermat测试的素数测试算法,其原理是:对于一个合数 n,有至少一半的 a 值,满足 a^(n-1) mod n != 1。因此,我们可以随机选取一些 a 值,进行计算,如果不等于 1,则 n 不是素数。如果等于 1,则 n 可能是素数,需要进行多次测试以提高准确性。 需要注意的是,Miller-Rabin算法的准确性与测试次数有关,测试次数越多,准确性越高。一般来说,10次左右的测试已经可以满足绝大多数情况。时间复杂度为 O(klog^3n),其中 k 为测试次数。 以上是常见的几种素数判断方法,每种方法都有其优缺点,可以根据实际情况选择合适的方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值