zoukankan      html  css  js  c++  java
  • LightOJ 1245: Harmonic Number (II) (数学)

    http://lightoj.com/volume_showproblem.php?problem=1245

    I was trying to solve problem '1234 - Harmonic Number', I wrote the following code

    long long H( int n ) {
        long long res = 0;
        for( int i = 1; i <= n; i++ )
            res = res + n / i;
        return res;
    }

    Yes, my error was that I was using the integer divisions only. However, you are given n, you have to find H(n) as in my code.

    Input

    Input starts with an integer T (≤ 1000), denoting the number of test cases.

    Each case starts with a line containing an integer n (1 ≤ n < 231).

    Output

    For each case, print the case number and H(n) calculated by the code.

    Sample Input

    Output for Sample Input

    11

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    2147483647

    Case 1: 1

    Case 2: 3

    Case 3: 5

    Case 4: 8

    Case 5: 10

    Case 6: 14

    Case 7: 16

    Case 8: 20

    Case 9: 23

    Case 10: 27

    Case 11: 46475828386

    题意分析:

    frac{n}{1}+frac{n}{2}+frac{n}{3}+......+frac{n}{n}

    解题思路:

    题目范围较大,直接求或者打表都会超时,

    可以拿24这个数来看看, 三个数分别为n , i, n/i。

    前两个数为24和12, 末尾有24-12个1,

    同理末尾有12-8个2,

    有8-6个3,

    有6-4个4.

    这样只要计算到sqrt{n},再考虑一下重复的情况,就能算出答案。

    #include <stdio.h>
    #include <math.h>
    int main()
    {
    	int t=0, T;
    	long long n, i, sum, temp, m;
    	scanf("%d", &T);
    	while(T--)
    	{
    		scanf("%lld", &n);
    		sum=0;
    		temp=n;
    		m=sqrt(n);
    		for(i=1; i<=m; i++)
    			sum+=n/i + (n/i - n/(i+1)) * i;
    		i--;	
    		if(n/i==m)
    			sum-=m;
    		printf("Case %d: %lld
    ", ++t, sum);
    	}
    	return 0;
    }
  • 相关阅读:
    AcWing356 次小生成树(lca)
    牛客 Rinne Loves Edges(dp)
    软件的生命周期和测试流程
    软件测试的学习经历回顾-第一天
    java List集合
    c#Socket通信
    c#线程2
    c#线程1
    c#Linq联合查询
    c#拓展方法
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/11852521.html
Copyright © 2011-2022 走看看