已知:S_n= 1+\frac{1}{2}+\frac{1}{3}+…+\frac{1}{n}S n​ =1+ 21​ + 31​ +…+ n1​ 。P1035 [NOIP2002 普及组] 级数求和

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

现给出一个整数 kk,要求计算出一个最小的 nn,使得 S_n>kSn​>k。

输入  1

输出 2

#include<stdio.h>

int main()

{
	double sum = 0.0,n=1.0,i =1.0;
	int k;
	scanf("%d",&k);
	for( i =1.0;;i++)
	{
		sum += n/i;
		
		if(sum > k)
		{
			break;
		}
	}
	printf("%.0lf",i);
	return 0;
}

根据题意,我们需要找到一个最小的正整数 nn,使得 s_n>ks n >k。 我们可以先尝试计算一下前几个 s_n 的值: s_1=1 s_2=1+1/2=1.5 s_3=1+1/2+1/3=1.8333... s_4=1+1/2+1/3+1/4=2.0833... 可以发现,随着 n 的增大,s_n 的增长速度越来越慢,而且增长的幅度也越来越小。因此,我们可以猜测,当 n 足够大时,s_n 的增长速度会趋近于一个常数,即 s_n 的增长率会趋近于一个定值。 我们可以进一步验证这个猜测。根据调和级数的性质,我们知道: s_n=1+1/2+1/3+...+1/n>ln(n)+γ 其中,γ≈.5772 是欧拉常数。因此,当 n 足够大时,s_n 的增长速度会趋近于 ln(n),即 s_n 的增长率会趋近于 1/n。 因此,我们可以设 s_n=k+ε,其中 ε> 很小。根据调和级数的性质,我们知道: s_n=1+1/2+1/3+...+1/n<1+1/2+1/3+...+1/(k+1)+ln(n-k)+γ 因此,当 n 足够大时,我们有: s_n<1+1/2+1/3+...+1/(k+1)+ln(n-k)+γ s_n-k<1/2+1/3+...+1/(k+1)+ln(n-k)+γ s_n-k-ln(n-k)-γ<1/2+1/3+...+1/(k+1) 因为右边的和式是一个调和级数的一部分,所以它是一个无穷级数,但是它是一个收敛的无穷级数。因此,我们可以找到一个足够大的正整数 n,使得左边的差值小于右边的和式,即: s_n-k-ln(n-k)-γ<1/2+1/3+...+1/(k+1)<1 因此,我们可以得到: s_n>k+ln(n-k)+γ 现在我们需要找到一个最小的正整数 n,使得上式成立。我们可以尝试将上式中的 ln(n-k) 替换成 ln(n),这样可以得到一个更简单的不等式: s_n>k+ln(n)+γ 现在我们需要找到一个最小的正整数 n,使得上式成立。我们可以使用二分查找的方法来解决这个问题。具体来说,我们可以设定一个左边界 l 和一个右边界 r,然后每次取它们的中间值 m=(l+r)/2,计算 s_m 和 k+ln(m)+γ 的大小关系,然后根据大小关系来更新左边界或右边界,直到找到一个最小的正整数 n,使得 s_n>k+ln(n)+γ。 代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z1Jxxx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值