【C语言】素数的判断方法----多方法详细分析

前言

素数的判断方法是我们在写程序的过程中经常碰到的问题,今天给大家带来素数的一些判断方法。


一、 什么是素数?

质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。

根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。

二、判断方法

把需要判断的数记作i

方法一(暴力筛选)

  • 写一个循环,产生2到i-1的数,创建一个变量j,将这些数放在j中;

  • 只要i%j有一次能够除尽,那么i就不是质数。

  • 再创建一个变量k=1,当不是质数时,将k赋0,

  • 循环结束后根据k的值,写一个if循环即可。

所以可以写出这样一个函数。

#include <stdio.h>
int main()
{
      int i = 0;
      scanf("%d",&i);
      int j = 0;
      int k = 1 ; 
      for(j = 2;j <= i-1;j++) 
      {
       if(i % j == 0 )
       {
             k = 0 ;
             break;
       }
      }   
      if(k)
      {
      printf("质数\n”);
      }
return 0;
}

方法二(奇数角度)

仔细思考一下,除2以外的偶数,全部都不是质数。
由此可以优化代码

#include <stdio.h>
int main()
{
      int i = 0;
      scanf("%d",&i);
      int j = 0;
      int k = 1;
      if( i ==1 || i == 2)
      {
      printf("质数\n”);
      }
      for(j = 3;j <= i-1;j += 2) 
      {
       if(i % j == 0 )
       {
             k = 0 ;
             break;
       }
      }   
      if(k)
      {
      printf("质数\n”);
      }
return 0;
}

方法三(开平方角度)

思考一下,每一个数都可以写成这样的形式
a = b * c
例如
4=2 * 2;
6 = 2 * 3;
24 = 2 * 12=3 * 8=4 * 6;
可以发现,无论是哪一个数,均存在这种规律,
每一个数i都可以拆成两个数相乘,且其中一定有一个数小于等于i的平方根。
至于如何开平方,这里引入一个库函数sqrt()
sqrt的头文件是<math.h>

可以写出代码

#include <stdio.h>
#include <math.h>
int main()
{
      int i = 0;
      scanf("%d",&i);
      int j = 0;
      int k = 1;
      if( i ==1 || i == 2)
      {
      printf("质数\n”);
      }
      for(j = 3;j <= sqrt(i) ;j += 2) 
      {
       if(i % j == 0 )
       {
             k = 0 ;
             break;
       }
      }   
      if(k)
      {
      printf("质数\n”);
      }
return 0;
}

方法四(函数角度)

结合以上方法,并写出函数形式。
代码如下

#include <stdio.h>
#include <math.h>//头文件很重要,不要忘记。

void is_prime(int i)
{
      int j = 0;
      int k = 1;
      if( i ==1 || i == 2)
      {
      printf("质数\n”);
      }
      for(j = 3;j <= sqrt(i) ;j += 2) 
      {
       if(i % j == 0 )
       {
             k = 0 ;
             break;
       }
      }   
      if(k)
      {
      printf("质数\n”);
      }
}

int main()
{
    int i = 0;
    scanf("%d",&i);
    is_prime(i);
    return 0;
}

结束语和拓展(各种nb的角度)

ok
其实还有更多更高级的方法,比如埃拉托斯特尼(Eratosthenes)筛法,线性筛选–欧拉筛法,欧拉筛法优化 等等受限于知识的限制,就先不分享啦

想要了解的小伙伴可以参考这篇文章

如果有更好的方法,请私信博主。


今天的分享到这里结束!
!!!!!!!!给新人博主一个关注吧!!!!!!!!
!!!!!!!!!!!!点点赞吧!!!!!!!!!!!

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值