问题:求n/i的和,1 <= i<= n
#include <bits/stdc++.h>
using namespace std;
int main ()
{
int l = 1, r , n, sum = 0;
cin >> n;
while(l <= n)
{
//每次是找和k = n / l商相同的值,因此l是左区间,右区间就是r = n / k,
r = n / (n / l);
sum = sum + (r - l + 1) * (n / l);
l = r + 1;
}
}
注意点:
如果求k/i的和,1 <= i<= n (k和n不相等)
1.如果n >= k,和上述代码一样,因为当l到k + 1时k / (k + 1)等于0,不会改变结果
2.如果n<k, 当r>n时应让r=n,具体见代码:
while(l<=n) //n<k的情况
{
r=k/(k/l);
if(r>n)
r=n;
ans-=(k/l)*(r-l+1)*(l+r)/2;
l=r+1;
}