素数定义:一个大于1的正整数,除了1和它本身以外,不能被其他正整数整除。
解题思路:先找出100-200之内所有的整数。让这个整数对除去1和它本身的数字取余,若余数为0,则不是素数。反之为素数。
#include<stdio.h>
#include<windows.h>
int IsPrime(int x)
{
int i = 2;
for (; i <= x ; i++){
if (x%i == 0){
return 0;
}
else{
return 1;
}
}
}
int main()
{
int i = 100;
for (i = 100; i <= 200; i++){
if (IsPrime(i) == 1){
printf("%d ", i);
}
}
system("pause");
return 0;
}
结果如下:
我们再想,一个数若不是素数,那它至少能整出2,我们按这个思路往下走,那是不是k++加到i/2的时候就不用再往下判断了呢?我们试着看一看:
修改部分:
int IsPrime(int x)
{
int i = 2;
for (; i <= x/2; i++){ //只需试到x/2
if (x%i == 0){
return 0;
}
else{
return 1;
}
}
}
结果和第一次一样:
Ok,我们来看另一种方法。
比如说我们要判断的这个数字x=ab,且a<b;那我们一个一个试x是否能被整除时,肯定会先试到较小的数字a。那假如a=b,即x=a^2呢,这时候a=√x,li是不是表示我们检测到a,也就是√x时,就已经可以证明它是素数了呢?
例:100=1010,要证明100不是素数,我们只用尝试1—10,到10就可以证明它不是素数了,我们试试看:
修改部分:
#include<stdio.h>
#include<windows.h>
#include<math.h> //注意引入#include<math.h>头文件,才能完成开平方语句
int IsPrime(int x)
{
int i = 2;
int top = sqrt(x); //对x开根号
for (; i <= top ; i++){ //试到√x
if (x%i == 0){
return 0;
}
else{
return 1;
}
}
}
结果当然还是一样的:
我们说了这三种方法,显而易见,第三种是尝试的数字最少的程序。我们知道,一个程序的好与坏不仅表现在可读性,也表现在他的效率,运行次数和所占空间大小等中,所以,我们要尽可能的优化程序,使它的效率最高,运行次数最少,所占空间最小。无论在哪方面,我相信,一个完美的程序正是我们所有人所追求的!