本文共 1242 字,大约阅读时间需要 4 分钟。
调和级数的这一变形问题需要计算n除以1到n的所有整数的和:H(n) = n/1 + n/2 + n/3 + ... + n/n。对于大型n,直接计算会出现浮点精度问题,因此需要一种更有效且精确的方法。
要高效解决这个问题,可以采用以下步骤:
以n=10为例:
#include#include using namespace std;long long harmonic(long long n) { long long m = (long long)sqrt(n); long long ans = 0; // 前sqrt(n)项的和 for (long long i = 1; i <= m; ++i) { ans += n / i; // 处理后续项:m+1到m的范围 long long l = n / i; long long r = n / (i + 1); if (l > r) { ans += (l - r) * i; } } // 确定是否是完全平方数,进行调整 if (n / m == m) { ans -= m; } return ans;}int main() { int T; long long n; int case_num = 1; scanf("%d", &T); while (T--) { scanf("%lld", &n); long long ans = harmonic(n); printf("Case %d: %lld\n", ++case_num, ans); } return 0;}
这段代码分为前sqrt(n)项和后续项的处理,通过减少计算次数,确保了在大n情况下的效率和精度。
转载地址:http://wgymz.baihongyu.com/