关于判断素数,自己很早之前就写个这个代码,还记得当时还上百度查了一下什么是素数,然后感慨道自己的数学功底真滴差,后来在老师的讲解下,发现关于一个小小的判断素数就有很多玄机,由于当时老师上课的笔记丢了,所以决定在博客上重新写一份,也算是汇总。
首先是输入一个数,判断这个数是否为素数。
#include <stdio.h>
#include <math.h>
int main()
{
int n;
int i;
scanf("%d",&n);
for(i=2;i<n;i++)
{
if(n%i==0)
{
printf("%d不是素数\n",n);
break;
}
}
if(i==n)
{
printf("%d是素数\n",n);
}
return 0;
}
这是当初写的代码,只能简单的判断一个数是否为代码,也没有使用调用自定义函数的形式,那么接下来我们优化一下。
bool Isprime(int n)
{
int i;
for(i = 2;i < n; i++)
{
if(n%i == 0)
{
return false;
break;
}
}
if(i == n)
{
return true;
}
}
int main()
{
int n;
scanf("%d",&n);
if(Isprime(n))
{
printf("%d是素数\n",n);
}
else
{
printf("%d不是素数\n",n);
}
return 0;
}
是不感觉还不如写到主函数中?其实不然,关于自定义函数的优点这里体现的不明显,所以我们本次不做关于自定义函数好坏的讨论,我们继续优化这个代码,现在问题来了,一次只能判断一个数字是不是不能达到我们的需求呢?那么我们修改一下代码,让其将n之前的所有素数全部带出来。
bool Isprime(int n)
{
int i;
for(i = 2;i < n; i++)
{
if(n%i == 0)
{
return false;
break;
}
}
if(i == n)
{
return true;
}
}
int main()
{
int n;
scanf("%d",&n);
printf("%d以内的素数有:\n",n);
for(int i = 2;i < n ; i++)
{
if(Isprime(i))
{
printf("%d\n",i);
}
}
return 0;
}
我们测试一个一百以内的素数:
其实仔细看就能发现,我们并没有修改自定义函数的内容,我们只是在主函数中做了个判断,就实现了我们上一个问题,这里也可以看出自定义函数的优势,虽然他有更大的优势,但是我们这里不做讨论。
写到这里在我之前的认知范围里基本上就结束了,但实际上再深入一点考虑到时间复杂度,我们还可以做一定的优化:
bool Isprime(int n)
{
int i;
for(i = 2;i <= sqrt(double(n)); i++)
{
if(n%i == 0)
{
return false;
break;
}
}
if(i == sqrt((double)n)+1)
{
return true;
}
}
这里是自定义函数,主函数部分和上面完全一致,但是这里使用的循环条件比起之前的,时间复杂度是根号n,这个学到之后我就感觉,算法,真的有趣。