首页 > 代码库 > 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级数,发散)