初学C语言 如何求素数(超详细)(逐渐优化)!

 题目要求:求100~200之间的素数,将他们打印出来,并且计数。

1、题目分析:

想要用c语言求出100~200之间的素数,首先我们要明白什么是素数。

素数(prime  number)又称质数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。

那么明白了什么是素数,就可以按照题目要求来编写代码求出100~200之间的素数。

 2、解题过程:

代码如下:

#include<stdio.h> //头文件

int main() {

  int count = 0; //定义计数的变量count
  for (int i = 100; i <= 200; i++) {    //for循环,定义i从100开始,若i小于等于200,i每次+1
        int flag = 1;          //最外层循环先定义flag为1,假设100~200之间都为素数
        for (int j = 2; j < i; j++) {      //内层循环,将j设定为除数
            if (i % j == 0) {
                flag = 0;     //若i%j没有余数,代表j可以被i整除,则不是素数,将flag赋值为0
                break;        //跳出内层循环
            }
        }
        if (flag == 1) {   //条件判断,当flag一直为1时,i为质素,则每有一个质素,count的值+1,同时打印出质数
                               
            count++;
            printf("%d ", i);
        }
    } 
    printf("\n共有:%d个素数", count);  //输出100~200之间共有几个质数
    return 0;
}

 代码运行的结果如下:

到这里,我们已经实现了求100~200之间的素数了,那么,我们能不能将这段代码优化一下,使程序更加有效率呢?

答案是可以的,而且有很多种方法!!!

3、优化思路

我们从素数的定义中可以知道, 素数除了1和它自身外,不能被其他自然数整除,那么我们便可以从101开始,到199结束,直接排除掉100~200之间的偶数,运算数量直接少了一半!

代码如下:

#include<stdio.h>
int main() {

	
	int count = 0;
	for (int a = 101; a < 200; a+=2) {
		int flag = 1;
		for (int b = 2; b < a; b++) {
			if (a % b == 0) {
				flag = 0;
				break;
			}
		}
		if (flag == 1) {
			count += 1;
			printf("%d ", a);
		}
	}
	printf("\n在100~200之间总共有%d个质数", count);
	return 0; 
}

代码运行的结果如下:

那么,再根据上面的方法,还能继续优化!

在优化前,我们先来了解一个数学知识,假设 n 是一个不是素数的正整数,那么它可以表示为两个正整数 a 和 b 的乘积,即 n=a×b,其中 1<a≤b<n。现在我们来看其中的一个因子,假设 a 是其中一个因子。因为 a≤b,所以 a≤\sqrt{n}。如果 𝑎>\sqrt{n},那么 𝑏>^{\sqrt{n}}​,因为a×b=n。这意味着,如果 n 不是素数,那么它的因子中至少有一个大于其平方根。

举个例子:

  1. 若   n=17  我们要确定是否为素数。
  2. 首先,计算 \sqrt{17}≈4.12317​≈4.123。
  3. 然后,我们检查范围在 2 和 4 之间的所有素数,即 2 和 3。
  4. 我们发现没有小于或等于 4 的素数能整除 17。
  5. 因此,根据根号法,我们得出结论:17 是素数。

那么,根据以上的方法,我们可以优化一下我们的代码,如下如所示

#include<stdio.h>
#include<math.h>    //要使用sqrt()的头文件
int main() {


	int count = 0;
	for (int a = 101; a < 200; a += 2) {
		int flag = 1;
		for (int b = 2; b <=sqrt(a); b++) {   sqrt() 是一个数学函数,用于计算一个数的平方根。
			if (a % b == 0) {
				flag = 0;
				break;
			}
		}
		if (flag == 1) {
			count += 1;
			printf("%d ", a);
		}
	}
	printf("\n在100~200之间总共有%d个质数", count);
	return 0;
}

代码运行的结果如下:

这篇博客到这就结束了,其中,想要求质数的方法还有很多种,我们可以再今后学习c语言的过程中再来回顾这些问题,写出更好的算法来解决。

篇幅有限,希望这篇文章能帮助到和我一样初学c语言的伙伴们。博主难免出现错误,欢迎指正!

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值