一、素数是什么?
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
——百度
二、如何用C语言求素数?
我们从一道练习题来探讨
分析
- 使用循环产生100~200之间的数字。
- 判断产生的数字是否是素数。
用代码实现
#include <stdio.h>
int main() {
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
//判断i是否是素数
//使用2~i-1之间的数字去试除i
//如果i被整除了,i就不是素数
//如果2~i-1之间没有数字可以整除i,i就是素数
int j = 0;
int flag = 1;//假设i是素数
for (j = 2; j <= i - 1; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
count++;
printf("%d\n", i);
}
}
printf("\n100~200一共有%d个素数\n", count);
return 0;
}
三、优化代码
我们知道除了2以外,所有的偶数都不可能是质数。
简单修改一下代码
#include <stdio.h>
int main() {
int i = 0;
int count = 0;
for (i = 101; i <= 200; i+=2)
//只产生100~200之间的奇数
{
//判断i是否是素数
//使用2~i-1之间的数字去试除i
//如果i被整除了,i就不是素数
//如果2~i-1之间没有数字可以整除i,i就是素数
int j = 0;
int flag = 1;//假设i是素数
for (j = 2; j <= i - 1; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
count++;
printf("%d\n", i);
}
}
printf("\n100~200一共有%d个素数\n", count);
return 0;
}
还有没有优化的空间呢?
如果有一个数字 i 可以写成 i = a*b
那么a和b中至少有一个数字是<=根号i的
代码中的 j <= i + 1 就可以改成 j <= sqrt(i)
#include <stdio.h>
#include <math.h>
int main() {
int i = 0;
int count = 0;
for (i = 101; i <= 200; i += 2)
//只产生100~200之间的奇数
{
//判断i是否是素数
//使用2~i-1之间的数字去试除i
//如果i被整除了,i就不是素数
//如果2~i-1之间没有数字可以整除i,i就是素数
int j = 0;
int flag = 1;//假设i是素数
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
count++;
printf("%d\n", i);
}
}
printf("\n100~200一共有%d个素数\n", count);
return 0;
}
这样优化就提升了很大效率
总结
本文使用了简单的for循环嵌套和if语句 实现了100~200的素数判断,2次优化让运算次数一步步地减少。