程序如下:
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);
}
}
}