1.原始题目
求100-200之间的素数。
素数:大于1且只能被1和其本身整除的数,如2、3、5、7、11、13......
2.原始方法
对100-200中的每个数都进行素数判断,而每个数n则从2-n-1进行遍历检查能否整除。
即下面代码:
#include<stdio.h>
int judge(int num) //判断一个数是否为素数
{
for (int i = 2; i < num; i++)
{
if (num % i == 0)
return 0;
}
return 1;
}
int main()
{
for (int i = 100; i <= 200; i++)
{
if (judge(i))
printf("%d ", i);
}
return 0;
}
3.进一步思考
1)仅对于一个数n而言,最理想的情况是√n *√n = n的情况,那么就会发现,如果存在一个数x在2-√n的范围内,并且n能被这个数x整除,那么必定存在另一个数y属于√n-n-1的范围也能够使得n被y整除——即我们只要判断n能否被2-√n之间的一个属整除就行,存在这样的数,n就不是素数,这就能在原来的思路上减少一半的计算量。
2)对于100-200的范围内,偶数必定不是素数,只需要判定奇数即可,这又能减少原来的一半。
于是有了下面代码:
#include<stdio.h>
#include<math.h>
int judge(int num) //判断一个数是否为素数
{
for (int i = 2; i <= sqrt(num); i++)
{
if (num % i == 0)
return 0;
}
return 1;
}
int main()
{
for (int i = 101; i < 200; i+=2)
{
if (judge(i))
printf("%d ", i);
}
return 0;
}