题目要求:求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≤。如果 𝑎>
,那么 𝑏>
,因为a×b=n。这意味着,如果 n 不是素数,那么它的因子中至少有一个大于其平方根。
举个例子:
- 若 n=17 我们要确定是否为素数。
- 首先,计算
≈4.12317≈4.123。
- 然后,我们检查范围在 2 和 4 之间的所有素数,即 2 和 3。
- 我们发现没有小于或等于 4 的素数能整除 17。
- 因此,根据根号法,我们得出结论: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语言的伙伴们。博主难免出现错误,欢迎指正!