判断是否是素数 C语言

 判断素数

输入一个正整数m,判断它是否为素数。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

判断一个数m是否为素数,需要检查该数是否能被除1和自身以外的其他数整除,即判断m是否能被2 ~ m-1之间的整数整除。用求余运算 % 来判断整除,余数为0表示能被整除,否则就意味着不能被整除。例如,9 % 3得0,说明9能被3整除,而7 % 2得1,说明7不能被2整除。

设i取值 [2, m-1],如果m不能被该区间上的任何一个数整除,即对每个i,m % i 都不为0,则m是素数;但是只要m能被该区间上的某个数整除,即只要找到一个i,使m % i为0,则m肯定不是素数。

由于m不可能被大于m/2的数整除,所以上述i的取值区间可缩小为[2, m/2],数学上能证明,该区间还可以是[2,m^(1/2)]。

源程序

/* 判断正整数m是否为素数 */

#include <stdio.h>

void main( )

{

     int i, m;

    printf("Input a number: ");  /* 输入提示 */

    scanf("%d", &m);

    for(i = 2; i <= sqrt(m); i++)/* 第9行 */

         if(m % i == 0)  

             break;        /* 若m能被某个i整除,则m不是素数,提前结束循环 */

   if(i >sqrt(m )/*如果循环正常结束,说明m不能被任何一个i整除,则m是素数 */

          printf("%d is a prime number! !\n", m);  

    else

         printf("No!\n");      

}

运行结果1

Input a number: 9

No!

运行结果2

Input a number: 11

11 is a prime number!

根据素数的定义,在for循环中,只要有一个i能满足m % i = 0,说明m能被i整除,则m肯定不是素数,不必再检查m能否被其他数整除,可提前结束循环;但是,如果发现某个i满足m%i != 0,不能得出任何结论,必须继续循环检测。

例如,输入9时,首先计算出9 % 2 != 0,不能下结论,还要继续循环,再算出9 % 3 == 0,说明9能被3整除,它不是素数,不必再用其他数检测,可以提前退出循环;输入11时,依次计算出11 % 2 != 0、11 % 3 !=0、11 % 4 != 0和11 % 5 != 0,说明11不能被区间 [2, sqrt(11)] 上的任何一个数整除,它是素数。

我们假设m是合数,那么一定存在一组大于2的整数k1和k2(k1<k2),使得k1*k2=m,

假设k1>‍m^(1/2)且k2>‍m^(1/2)

那么k1*k2>m与k1*k2=m相矛盾

假设不成立,则k1<m^(1/2)。

上面的结论就说明,如果一个数是合数,那么在[2,‍m^(1/2)]区间之内一定有m的因子(也就是说一定存在一个整数数k1使得m%k1=0).

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值