Harmonic Number

题目:

In mathematics, the nth harmonic number is the sum of the reciprocals of the first n natural numbers:

In this problem, you are given n, you have to find Hn.

输入:

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

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

输出:

For each case, print the case number and the nth harmonic number. Errors less than 10-8 will be ignored.

样例输入:

12

1

2

3

4

5

6

7

8

9

90000000

99999999

100000000

样例输出:

Case 1: 1

Case 2: 1.5

Case 3: 1.8333333333

Case 4: 2.0833333333

Case 5: 2.2833333333

Case 6: 2.450

Case 7: 2.5928571429

Case 8: 2.7178571429

Case 9: 2.8289682540

Case 10: 18.8925358988

Case 11: 18.9978964039

Case 12: 18.9978964139

这个题就是根据公式来求,但是要是直接求的话会超时,所以建一个数组,隔一部分都这部分的和存下来,就会节省很多时间

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
double s[2000010];
void aa()
{
    double a=0;
    for(int i=1;i<100000010;i++)
    {
        a+=(1.0/i);
        if(i%50==0)//隔50个数,把这些数加起来
            s[i/50]=a;//第一个50是s[1],第二个50是s[2]。以此类推
    }
}
int main()
{
    aa();
    int t;
    scanf("%d",&t);
    int ans=1;
    while(t--)
    {
        double n;
        scanf("%lf",&n);
        double sum=1.0;
        int x=n/50;
        sum=s[x];
        for(int i=50*x+1;i<=n;i++)//如果这个数大于50,那sum直接就是前50个数的和,如果不是,就一个一个的加
        {
            sum+=(1.0/i);
        }
        printf("Case %d: %.10lf\n",ans++,sum);
    }
    return 0;
}

 

  • 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、付费专栏及课程。

余额充值