题目
键盘输入一个数, 判断是否为素数
思路
-
最直观的想法就是用1-n 中间的数依次除, 有能被整除的那就不是了。这样的时间复杂度是O(n).
-
我们可以总结一下:一个数字, 如果它是两个数字的乘机,那么它的分解因子怎么分布呢?
15 = 3 * 5, 3 5 都小于 15/2
16 = 2 * 8 2 8 小于等于 16/2 这应该就是最极端的了吧
综上, 我们就可以只试 2- n/2 之间的数就可以了 -
我们进一步总价一下:
16 = 2 * 8
= 4 * 4
= 8 * 224 = 2 * 12
= 3 * 8
= 4 * 6
= 4. 8989 * 4.8989
= 6 * 4
= 8 * 3
= 12 * 2
我们发现, 被乘数 增加, 乘数就减小。 过了某一个界限, 其实就是乘数和被乘数互换位置。 鉴于乘法的交换律。 其实就是一样的了。那么这个界限是什么呢。最理想的时候也就是 n的开方
代码
#include<stdio.h>
#include<math.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a < 1) {
printf("funck\n");
return 0;
}
int i = 0;
for (i = 2; i * i <= a; ++i) {
if (! (a % i)) {
printf("No\n");
return 0;
}
}
printf("Yes\n");
return 1;
}