Harmonic Number (II)

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
11
1
2
3
4
5
6
7
8
9
10
2147483647
Sample Output
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

题意:

让你用求h(n);

思路:暴力的话会超时,所以我们就要找规律看看,你会发现假设 tmp 是 n/i 的值,当n == 10的时候(取具体值)

当 tmp = 1 时,个数 是10/1 - 10/2 == 5个

当 tmp = 2 时,个数 是10/2 - 10/3 == 2个

当 tmp = 3 时,个数 是10/3 - 10/4 == 1个
…………
当 tmp = 10时,个数是10/10 - 10/11 == 1个
所以我们发现有个规律了,当tmp == i 的时候,我们要求的个数就是 10/i - 10/(i+1),然后我们前1 — sqrt(n)个数的数值还是比较大的,但是数据范围变小了
暴力可以求出来(从1到sqrt(n)算出n/i>=sqrt(n)的情况),剩下的 sqrt(n)+1 — n个数中 数据范围还是比较大,但是 n/i 的数据范围介于 1 - sqrt(n)之间,所以用我们找出的规律可以求出来
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    int t;
    scanf("%d",&t);
    int g=0;
    while(t--)
    {
        ++g;
        int n;
        scanf("%d",&n);
        int m=sqrt(n);
        long long int sum=0;
        for(int i=1;i<=m;i++)
        {
             sum+=n/i;
        }
            for(int temp=1;temp<=m;temp++)
                sum+=temp*((n/temp)-(n/(temp+1)));
            if(m==n/m)
                sum-=m;
            printf("Case %d: %lld\n",g,sum);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Harmonic analysis is a mathematical tool used to analyze periodic functions by decomposing them into a sum of sinusoidal functions with different frequencies, amplitudes, and phases. In order to perform harmonic analysis using C programming language, the following steps can be followed: 1. Define the periodic function to be analyzed as a series of discrete values. This can be done by either inputting the values manually or by reading them from a file. 2. Calculate the discrete Fourier transform (DFT) of the input signal using the Fast Fourier Transform (FFT) algorithm. This can be implemented using the FFTW library or by writing your own FFT algorithm. 3. Extract the frequency spectrum of the input signal by calculating the magnitude and phase of each frequency component in the DFT output. 4. Use the frequency spectrum to analyze the harmonic content of the input signal by identifying the dominant frequencies and their corresponding amplitudes and phases. 5. Visualize the harmonic analysis results using plots and graphs to better understand the periodic nature of the input signal. Here is an example code snippet in C that performs harmonic analysis on a given periodic function using FFT: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #include <fftw3.h> #define N 256 // number of discrete samples #define Fs 1000.0 // sampling frequency #define f1 50.0 // fundamental frequency #define f2 100.0 // second harmonic frequency int main() { double x[N], y[N], freq[N], mag[N], phase[N]; int i; // generate a test signal with two harmonics for (i = 0; i < N; i++) { x[i] = sin(2.0 * M_PI * f1 * i / Fs) + 0.5 * sin(2.0 * M_PI * f2 * i / Fs); } // perform FFT on the input signal fftw_complex *in, *out; fftw_plan p; in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); for (i = 0; i < N; i++) { in[i][0] = x[i]; in[i][1] = 0.0; } p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(p); // extract frequency spectrum from the FFT output for (i = 0; i < N; i++) { freq[i] = i * Fs / N; mag[i] = sqrt(out[i][0] * out[i][0] + out[i][1] * out[i][1]) / N; phase[i] = atan2(out[i][1], out[i][0]); } // print out the harmonic content of the input signal printf("Frequency\tMagnitude\tPhase\n"); for (i = 0; i < N/2; i++) { printf("%f\t%f\t%f\n", freq[i], mag[i], phase[i]); } // clean up resources fftw_destroy_plan(p); fftw_free(in); fftw_free(out); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值