C语言 ——— 打印100~200之间的素数

  • 何为素数?
  1. 是一个大于1的自然数,除了1和它自身以外,不能被其他自然数整除的数
  2. 例如:11这个数,11只能被1和11整除,这样的数称之为素数(也叫质数)
  • 如何判断一个数是否为素数
  1. 素数的特征:只能被1和本身整除
  2. 假设有一个整数:n,如何判断n是否为素数呢(试除法)
  3. 根据素数的特点,遍历 2 ~ (n-1) 的数
  4. 看n是否能被2 ~ (n-1) 之间的数整除,如果能被整除,则n就不是素数,如果不能被整除,则n就是素数
  • 解题思路

遍历100~200之间所有整数

	//遍历100~200之间的数
	for (int n = 100; n <= 200; n++)
	{
		//判断n是否为素数
	}

再在for循环内部遍历 2 ~ (n-1) 的数,并用n % (2 ~ (n-1)) 的数,看n是否能被整除

	//遍历100~200之间的数
	for (int n = 100; n <= 200; n++)
	{
		//遍历2~(n-1)的数
		for (int j = 2; j < n; j++)
		{
			if (n % j == 0)
			{
				
			}
		}
	}
  1.  立一个flag,最开始值为1,
  2. 当 n%j == 0 的if条件成立时,则表示此时的n不为素数,
  3. 这时则把flag置为0,
  4. 当flag置为0时就不用再判断当前的n是否为素数了,则break跳出此次的内部for循环,
  5. 再判断flag的值,为1则表示当前外部for循环的n是素数,为0则表示当初外部for循环的n不是素数
#include<stdio.h>
int main()
{
	//遍历100~200之间的数
	for (int n = 100; n <= 200; n++)
	{
		//插旗,用来标记n是否为素数,假设flag为1时,n就是素数
		int flag = 1;

		//遍历2~(n-1)的数
		for (int j = 2; j < n; j++)
		{
			if (n % j == 0)
			{
				//当n能被除了1和自身以外的数除净时,此时的n就不是素数,所以将flag置为0
				flag = 0;
				break;
			}
		}

		//每次内部循环结束时,判断flag的值
		if (flag == 1)
			printf("%d ", n);
	}
	return 0;
}
  • 当前代码只是完成,效率并不高,优化外部for循环代码
  1. 偶数除了能被1和本身整除,也一定能被2整除,所以偶数不可能会是素数,
  2. 因此可以不用从100遍历到200,初始从101开始遍历,每次遍历n+=2即可
  • 优化内部for循环代码
  1. k = m*n(k、m、n均为整数)
  2. 如果一个整数k能写成m*n的形式,那么m或者n其中一个数肯定小于或等于开平方k
  3. 举例:16 = 2*8   且   16 = 4*4
  4. 那么16中的2、4、8因子,肯定有小于或等于开平方16的
  5. 所以判断一个整数n是否为素数,只需要把 2~开平方n 的数试除n,看是否能被整除即可
  6. sqrt函数 - 开平方函数,此函数的头文件为#include<math.h>
#include<stdio.h>
#include<math.h>
int main()
{
	//遍历100~200之间的奇数
	for (int n = 101; n <= 200; n+=2)
	{
		//插旗,用来标记n是否为素数,假设flag为1时,n就是素数
		int flag = 1;

		//遍历2~开平方n之间的数
		for (int j = 2; j <= sqrt(n); j++)
		{
			if (n % j == 0)
			{
				//当n能被除了1和自身以外的数除净时,此时的n就不是素数,所以将flag置为0
				flag = 0;
				break;
			}
		}

		//每次内部循环结束时,判断flag的值
		if (flag == 1)
			printf("%d ", n);
	}
	return 0;
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值