/*给出一个浮点数c,求出使得 不等式 1/2 + 1/3 + ... + 1/(n+1) >= c 成立的最小 n。
既然题目已经给出上限是5.20则可以求出,n最大为280.
using namespace std;
double a[300];
int search_c(double c)
{
int i=1,j=280;
while (j-i>1) /*注意条件*/
{
int mid=(i+j)/2;
if (a[mid]<c)i=mid;
if (a[mid]>=c)j=mid; /*取超过c的最小的n,故等号在j处*/
}
if (a[i]>=c) return i;else return j; /*可能c比a[1]还要小*/
}
int main()
{
int i;
a[0]=0;
for (i=1;i<=280;i++)
a[i]=double((a[i-1]+1.0/double(i+1))*100/1)/100.0; /*打表,保留有限小数位*/
double c;
cin>>c;
while (c>0)
{
cout<<search_c(c)<<" card(s)"<<endl;
cin>>c;
}
return 0;
}
既然题目已经给出上限是5.20则可以求出,n最大为280.
用二分查找,但是由于数组长度很短,时间上不会有太大的差别。*/
#include <iostream>
#include <stdio.h>using namespace std;
double a[300];
int search_c(double c)
{
int i=1,j=280;
while (j-i>1) /*注意条件*/
{
int mid=(i+j)/2;
if (a[mid]<c)i=mid;
if (a[mid]>=c)j=mid; /*取超过c的最小的n,故等号在j处*/
}
if (a[i]>=c) return i;else return j; /*可能c比a[1]还要小*/
}
int main()
{
int i;
a[0]=0;
for (i=1;i<=280;i++)
a[i]=double((a[i-1]+1.0/double(i+1))*100/1)/100.0; /*打表,保留有限小数位*/
double c;
cin>>c;
while (c>0)
{
cout<<search_c(c)<<" card(s)"<<endl;
cin>>c;
}
return 0;
}