P1035 [NOIP2002 普及组] 级数求和

题目描述

已知:S_n= 1+\frac{1}{2}+\frac{1}{3}+…+\frac{1}{n}S**n=1+21+31+…+n1。显然对于任意一个整数 kk,当 nn 足够大的时候,S_n>kS**n>k

现给出一个整数 kk,要求计算出一个最小的 nn,使得 S_n>kS**n>k

输入格式

一个正整数 kk

输出格式

一个正整数 nn

输入输出样例

输入 #1复制

1

输出 #1复制

2

说明/提示

【数据范围】

对于 100%100% 的数据,1\le k \le 151≤k≤15。


解法一:可作为练习(提交只能40分)

package com.kk.luogu;


import java.util.Scanner;

//级数求和
public class P1035 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int nums=scanner.nextInt();
System.out.println(SummationOfSeries(nums));
}

public static int SummationOfSeries(int num){
double sum=0;
int i=1;
int tmp=0;
for ( i = 1; i < 10005; i++) {
sum+=(double) 1/i;
if(sum>num) {
tmp=i;
break;
}
}
return tmp;
}

}

解法二:枚举法(得100分)

#include<bits/stdc++.h>
using namespace std;
int main() {
int k,n=0;
cin>>k;
for(double Sn=0;Sn<=k;++n,Sn+=1.0/n);
cout<<n;
return 0;
}