当初老师对我提出如何判断一个数为素数,我想到的是用最基础的,假设输入的该数为a,用a分别除以2~a-1,看是否有能整除的,以此来判断。
但后面老师对我说最优解法是除到该数的根号即可,这让我百思不得其解,通过多方面了解,发现这就是一个简单的数学原理。
这是最开始我的解法。
#include<stdio.h>
int main()
{
int a, b;
scanf("%d", &a);
for (b = 2; b <= a - 1; b++)
if (a % b == 0)break;
if (b < a)printf("该数不是素数");
else printf("该数是素数");
return 0;
}
这是经过提醒改进之后的解法,相比上一个,循环次数减少,避免了冗杂运算。
#include<stdio.h>
int main()
{
int a, b;
scanf("%d", &a);
for (b = 2; b <= a/2; b++)
if (a % b == 0)break;
if (b <= a / 2)printf("该数不是素数");
else printf("该数是素数");
return 0;
}
根据可得:
如若我们输入的数为一个合数n,那么总会存在a*b=n,那么a,b中总有一个数>= 根号n,总有一个数<=根号n,所以,只要小于根号n的数(1除外)不能整除n,则n一定为素数。
根据这样的数学原理,我们可以对该代码进行进一步的改良,使其运算时间更短。
#include<math.h>
int main()
{
int a, b;
scanf("%d", &a);
for (b = 2; b <= sqrt(a); b++)
if (a % b == 0)break;
if (b <= sqrt(a))printf("该数不是素数");
else printf("该数是素数");
return 0;
}