//第一张二分之一,第二张三分之一,依此类推
//你能使一叠在桌子上的卡片向桌子外伸出多远
//POJ 1003
//使用二分法
#include<iostream>
using namespace std;
const int maxn=300;
const double delta=1e-8; //设定精度,因为有实数比较
int zero(double x) //若小于0的负数返回-1,
{ //若大于0则返回1
if(x<-delta) //若等于0则返回0
return -1;
return x>delta;
}
int main()
{
double len[maxn]; //直接计算出截止长度不超过5.20所需的最少卡片数
int total;
len[0]=0; //直接计算出截止长度不超过5.20所需的最少卡片数
for(total=1;zero(len[total-1]-5.20)<0;++total)
{
len[total]=len[total-1]+1.0/double(total+1);
}
double x;
cin>>x;
while(zero(x))
{
int l,r;
l=0;
r=total;
while(l+1<r)
{
int mid=(l+r)/2;
if(zero(len[mid]-x)<0)
{
l=mid;
}
else
{
r=mid;
}
}
cout<<r<<" card(s)"<<endl;
cin>>x;
}
return 0;
}
//你能使一叠在桌子上的卡片向桌子外伸出多远
//POJ 1003
//使用二分法
#include<iostream>
using namespace std;
const int maxn=300;
const double delta=1e-8; //设定精度,因为有实数比较
int zero(double x) //若小于0的负数返回-1,
{ //若大于0则返回1
if(x<-delta) //若等于0则返回0
return -1;
return x>delta;
}
int main()
{
double len[maxn]; //直接计算出截止长度不超过5.20所需的最少卡片数
int total;
len[0]=0; //直接计算出截止长度不超过5.20所需的最少卡片数
for(total=1;zero(len[total-1]-5.20)<0;++total)
{
len[total]=len[total-1]+1.0/double(total+1);
}
double x;
cin>>x;
while(zero(x))
{
int l,r;
l=0;
r=total;
while(l+1<r)
{
int mid=(l+r)/2;
if(zero(len[mid]-x)<0)
{
l=mid;
}
else
{
r=mid;
}
}
cout<<r<<" card(s)"<<endl;
cin>>x;
}
return 0;
}