C语言求100到500的所有质数,每10个数字一行打印

什么是质数?

质数就是只能被1和他自己整除的数字

怎么实现这个程序?

使用for循环求出范围内所有数字,嵌套一个for循环求出1到范围内某个数字的平方根的所有数字,再通过求模运算来判断是否能整除,从而来判断是否为质数。

为什么是平方根呢?

  • 第一次代码优化

一个数字的因数里,除了1和自己以外最大的因数一定小于等于自身的一半,换句话讲,一个数字不可能被大于自身一半的数字整除。

36的因数            32的因数
218216
31248
4984
66162
94
123
182

  • 第二次代码优化

有了上一次的优化后我们可以尝试列出几个数字的所有因数,例如上图的36和32。不难发现,36的平方根之后的因数9,12,18所对应的4,3,2重复出现了两次,所以没有意义。32的平方根约等于5.66,介于4和8之间,平方根之后的因数也是重复的。所以我们可以得出结论:除重复的因数外,一个数的最大的因数小于等于该数的平方根。

此方法的核心就在于内层for循环是如何结束的,其一:不符合内层循环的判断条件,循环结束;其二:在内层循环的循环体中break提前结束。

代码如下:

#include <stdio.h>
#include <math.h>
int main()
{	//定义count为计数器,后面会用它来记录打印次数
	int count = 0;
	//外层循环求出100-500的所有数字
    for(int i = 100; i <= 500; i++){
		int j;
		//内层循环求出2到该数字i的平方根	
		for(j = 2; j <= sqrt(i); j++){
			//判断:数字i能否被j整除
			if(i % j == 0)
            //如未整除,则继续执行内层循环的表达式“j++”
			//如果整除,则i为合数,提前结束内层循环,执行外层循环
			break;
		}
	//根据for循环的执行顺序:表达式1->表达式2->循环体->表达式3
	//循环体中if语句的判断结果若始终为假,将再次返回到表达式3
	//执行内层循环的表达式“j++”后,该循环的判断条件为假,内层循环结束
	//判断:j是否大于数字i的平方根
	if(j > sqrt(i)){
		//如果条件成立,打印该数字并格式化打印语句
	    printf("%4d ",i);
		//打印一次,计数器自增1
        count++;
		//判断:当计数器是10的倍数,打印一个回车符
        if(count % 10 == 0)
            printf("\n");
	    }
		//执行到这里就完成了对一个数字的判断
		//继续执行外层for循环,对下一个数字进行判断
    }
}



运行结果如下图:

d0f37cd4ce5144f89c8efc378c0926b0.png

声明:文章属作者原创,禁止抄袭搬运,转载请注明作者 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值