数论——1
作者:
就是要AC
,
2021-04-29 10:58:18
,
所有人可见
,
阅读 431
1. 质数的判断
质数:在大于1的整数中,如果只包含1和它本身这两个约数,就被成为质数,或者叫素数.
如果 d | n, 则(n / d) | n. ------ 可以发现n的所有约数都是成双成对出现的.
质数定理: 1 - n中有n / lnn 个质数.
调和级数: 1 + 1 / 2 + 1 / 3 + 1 / 4 + ··· = lnn + C(0.577)
1.朴素做法 ---- O(n)O(n)
bool is_prime(int n){
if(n < 2) return false;
for(int i = 2; i < n; i ++){
if(n % i == 0){
return false;
}
}
return true;
}
2.改进版 ---- O(n√)O(n)(一定是)
bool is_prime(int n){
if(n < 2) return false;
for(int i = 2; i <= n / i; i ++){//约数成对出现,i 和 n / i, 枚举到较小的那个即可.
if(n % i == 0){
return false;
}
}
return true;
}
尽量不要写成:
1. for(int i = 2; i * i <= n; i ++) // 但 i 较大时, i * i 可能超出int的最大表示范围,导致结果出错.
2. for(int i = 2; i <= sqrt(n); i ++) // 反复调用sqrt()函数, 运行效率比较低
建议写成:
for(int i = 2; i <= n / i; i ++) // 可以很好地规避上述情况