C++
/*
Hn=ln(n)+c+1.0/(2*n)
sum=log(n+1)+R-1.0/(2*n);
r=0.57721566490153286060651209(r就是欧拉常数)。
当n大于1e5时,答案等于
0.57721566490153286060651209+log(n)
*/
#include<bits/stdc++.h>
using namespace std;
const double c=0.57721566490153286060651209;
double ans[10005]={0,};
void init(){
for(int i=1;i<10000;i++){
ans[i]=ans[i-1]+1.0/i;
}
}
int main(){
int n;
init();
while(~scanf("%d",&n)){
double tmp;
if(n<10000){
tmp = ans[n];
}else{
tmp = log(n)+c+1.0/(2*n);
}
printf("%.4f\n", tmp);
}
return 0;
}
Java:
import java.io.*;
import java.math.*;
import java.util.*;
import java.math.BigInteger;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.Scanner;
public class Main{
static PrintStream putOut = System.out;
static BigDecimal ans[] = new BigDecimal[10005];
static double c=0.57721566490153286060651209;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
ans[0]=BigDecimal.valueOf(0);
for(int i=1;i<10000;i++){
ans[i]=ans[i-1].add(BigDecimal.valueOf(1.0/i));
}
int tim = cin.nextInt();
for(int t=0;t<tim;++t){
int n = cin.nextInt();
BigDecimal tmp = new BigDecimal(0);
if(n<10000){
tmp = ans[n];
}else{
tmp = BigDecimal.valueOf(Math.log(n)+c+1.0/(2*n));
}
putOut.println(String.format("%.1f", tmp));
}
}
}
练习题:
FZU2278