算法学习

今天学习了约数的个数怎么求,一般的算法会超时。这时我们需要用到一个定理: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;
}

 

posted @ 2024-02-03 08:03  橘子味芬达水  阅读(6)  评论(0编辑  收藏  举报