首页 > 代码库 > 1003调和级数(p级数,发散)
1003调和级数(p级数,发散)
题目大意:
已知c=1/2+1/3+1/4+....1/(n+1).现给出一个值m,当c>=m刚好成立时输出n的值。
解法1:也是我一开始的思路,就是直接算,注意浮点处理。
#include<stdio.h>
int main()
{
float len=0;
float num;
int n;
while(scanf("%f",&len),len)
{
n=3;
num=1.00/2;
while(num<len)
{
num+=1.00/n;
n++;
}
printf("%d card(s)\n",n-2);
}
return 0;
}
A完百度了一下,发现还有用查找做的..这很强势,不过这个277需要自己算。
Euler(欧拉)在1734年,利用Newton的成果,首先获得了调和级数有限多项和的值。结果是:
1+1/2+1/3+1/4+...+1/n= ln(n+1)+r(r为常量) 有题意知:max(1/2+1/3+1/4..+1/(n+1))=5.20
#include<stdio.h>
float sum[278]={0};
int binary(float sum[],int low,int high,float c)
{
int mid;
while(high - low > 1)
{
mid= (high + low)>>1;
if(c > sum[mid])
low = mid ;
else high = mid;
}
return sum[low]== c?low:high;
}
int main()
{
float c;
for(int i=1;i<=277;i++)
{
sum[i]=sum[i-1]+1.00/(i+1);
}
while(scanf("%f",&c),c)
{
printf("%d cards(s)\n",binary(sum,0,277,c));
}
return 0;
}
1003调和级数(p级数,发散)