关于素数求解问题
问题:打印100~200之间的素数
素数概念:对于大于1的自然数,除了1和它自身,不能被其它自然数整除的数称为素数。
看到这个问题,有很多种解法,最容易想到的就为:
#include <stdio.h>
int main()
{
int num=0;
int div=0;
for(num=100;num<=200;num++)
{
for(div=2;div<num;div++)
{
if(num%div==0)
{
break;
}
}
if(div==num)
{
printf("%d ",num);
}
}
printf("\n");
return 0;
}
但是这是可以优化的,一个数不是素数,则必定存在一个整数小于等于num/2可以整除num,所以优化为:
#include <stdio.h>
int main()
{
int num=0;
int div=0;
for(num=100;num<=200;num++)
{
for(div=2;div<=num/2;div++)
{
if(num%div==0)
{
break;
}
}
if(div>num/2)
{
printf("%d ",num);
}
}
printf("\n");
return 0;
}
这样就检索了一半的数字,节省了一半时间,提高了效率,但在此基础上是可以再进行优化的:若不是素数,则必定存在一个整数<=sqrt(num)可以整除num,所以优化为:
#include <stdio.h>
#include <math.h>
int main()
{
int num=0;
int div=0;
for(num=100;num<=200;num++)
{
for(div=2;div<=sqrt((double)num);div++)
{
if(num%div==0)
{
break;
}
}
if(div>sqrt((double)num))
{
printf("%d ",num);
}
}
printf("\n");
return 0;
}
在此基础上,对于素数只有奇数有可能为素数,偶数不可能,所以可以进一步优化:
#include <stdio.h>
#include <math.h>
int main()
{
int num=0;
int div=0;
for(num=101;num<=200;num+=2)
{
for(div=2;div<=sqrt((double)num);div++)
{
if(num%div==0)
{
break;
}
}
if(div>sqrt((double)num))
{
printf("%d ",num);
}
}
printf("\n");
return 0;
}
这是其中一种思路的优化,也可以用另一种方法,如:
#include <stdio.h>
#include <math.h>
int main()
{
int num=0;
int div=0;
for(num=101;num<=200;num+=2)
{
int flag=1;
for(div=2;div<num;div++)
{
if(num%div==0)
{
flag=0;
break;
}
}
if(flag)
{
printf("%d ",num);
}
}
printf("\n");
return 0;
}
所以素数也可以由很多种方法求解,也可以进行不断的优化......