算法学习
今天学习了约数的个数怎么求,一般的算法会超时。这时我们需要用到一个定理:p=[n/i]:表示在[1,n]的区间内,有约数i的个数为p个。所以这时,在求约数个数的问题上,我们只需要遍历[1,n],设置一个计数器即可。
当n很大时,跨越太大,这时i++、就会很慢,设置j = n/ (n/i)+1;下一次让i = j;这样跨度较大,时间复杂度较小。
参考资料:http://t.csdnimg.cn/TYwdJ
代码实现:
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
int n;
cin >> n;
int res = 0;
int i, j;
for (i = 1; i <= n; i = j) {
j = n / (n / i) + 1;
res += (n / i ) * (j - i);
}
cout << res << endl;
return 0;
}