c语言中判断一个数是否是质数思路分析

程序如下:

bool func(int num)
{
    int i = 2;
    if(num<=1)
        return false;
    while(i<num&&num%i!=0)
    {
         i++;
    }
    if(i == num) 
        printf("num是质数");
    else
        printf("num是合数");
    return true;
 }

思路分析:

1、缩小num的范围,排除不合理的数据;num的范围为num>1;

2、while循环中分析一般情况,i<num,且num%i!=0;(num>2开始,故少num=2的情况)

while循环体的意思是:比num小的数,都不能被num整除;

3、退出循环体及未进入循环体的情况:

1)退出循环体的情况:

循环体内条件i<num且num%i!=0;

故退出循环体的条件即是循环条件的非即:i>=num或num%i==0,这种情况再细分为三种情况(一条条件成立,另一个条件不成立,或者二者都成立)

i>=num且num%i!=0;//这种情况不存在,因为i=num的时候,刚好num%i==0;

i<num且num%i==0;//合数

i>=num且num%i==0;//质数

其实,退出循环体的情况,不存在i>num的情况,所以,以上i>=num,也可以写成i==num;

2)未进入循环体的情况,我们上述已经分析了,只有num>2的情况才会进入循环体,所以,此处需要分析num=2的情况。

将num==2带入到如下的代码中,发现也成立,所以最终退出循环和为进入循环的情况可以合并。

if(i == num) 
    printf("num是质数");

例2:输出1-100以内的质数

func()
{
    for(int i=2;i<=100;i++)
    {
        bool flag = true;//假设为质数
        for(int j = 2;j<i;j++)//判断为合数,就不输出
        {
            if(i%j==0)//表示i为合数,但我们要找质数,所以需要一个flag来在for循环外判断。
            {
                flag = false;
                break;
            }
        }
        if(flag)
        {
            printf("%d",i);
         }
    }
}

对上述程序进行优化:

我们以24为例分析,从4开始,24的因数就开始重复了,所以我们只需要判断到根号24就可以,二不是判断到23.

1 24

2 12

3 8

4 6 

6 4

故优化如下:

func()
{
    for(int i=2;i<=100;i++)
    {
        bool flag = true;//假设为质数
        int temp = sqrt(i);
        for(int j = 2;j<=temp;j++)//判断为合数,就不输出
        {
            if(i%j==0)//表示i为合数,但我们要找质数,所以需要一个flag来在for循环外判断。
            {
                flag = false;
                break;
            }
        }
        if(flag)
        {
            printf("%d",i);
         }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值