已知Sn=1+1/2+1/3+…+1/n,对于任意一个整数K,当n满足够大的时候,Sn>K
标签(空格分隔): 数据结构和算法
题目:
已知Sn=1+1/2+1/3+...+1/n,对于任意一个整数K,当n满足够大的时候,Sn>K。
给出一个整数K(1<=K<=15),要求计算出一个最大的N,使得Sn>K。
样例
输入:int K 10
输出:12367
说明:题目可以使用多种语言。这里使用JAVA。
由于时间限制,所以使用while n+=1/n,不可行。所以我们可以从Sn=1+1/2+1/3+…+1/n下手。
在数学中“欧拉公式”给出:
1+1/2+1/3+……+1/n=ln(n+1)+C,C为欧拉常数 数值是0.5772…….
Euler(欧拉)在1734年,利用牛顿的成果,首先获得了调和级数有限多项和的值。
结果是: 1+1/2+1/3+1/4+...+1/n= ln(n+1)+r(r为常量) 他的证明是这样的:
根据牛顿的幂级数有: ln(1+1/x) = 1/x - 1/2x^2 + 1/3x^3 - ...
①: 1/x = ln((x+1)/x) + 1/2x^2 - 1/3x^3 + ...
②:代入x=1,2,...,n,就得到 1/1 = ln(2) + 1/2 - 1/3 + 1/4 -1/5 + ... 1/2 = ln(3/2) + 1/2*4 - 1/3*8 + 1/4*16 - ... ...... 1/n = ln((n+1)/n) + 1/2n^2 - 1/3n^3 + ...
③:相加,就得到: 1+1/2+1/3+1/4+...1/n = ln(n+1) + 1/2*(1+1/4+1/9+...+1/n^2) - 1/3*(1+1/8+1/27+...+1/n^3) + ...... 后面那一串和都是收敛的。
④:我们可以定义 1+1/2+1/3+1/4+...1/n = ln(n+1) + r Euler近似地计算了r的值,约为0.577218。 这个数字就是后来称作的欧拉常数。
有了这些我们结合java中的Math数学函数API:Math.log()
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
//定义常量
final double R = 0.577218;
if (k <= 15 && k > 1) {
int n = 1;
long start = System.currentTimeMillis();
while (true) {
double log = Math.log(n + 1) + R;
if (log > k) {
long end = System.currentTimeMillis();
System.out.println("时间:"+end - start);
break;
} else {
n++;
}
}
System.out.print(n + 1);
}
}
}
结果:
时间:229
12367
总结:
主要是结合数学和JavaAPI进行编程。
利用欧拉公式解决Sn大于K问题
博客探讨了如何利用数学中的欧拉公式1+1/2+1/3+…+1/n=ln(n+1)+C来解决对于任意整数K,当n足够大时Sn>K的问题。文章指出,由于时间限制,不能采用n+=1/n的方式,而是借助Java的Math.log()函数来实现。通过代码实现,得出结论。
5575

被折叠的 条评论
为什么被折叠?



