Life is short, so we need program

每日一题, 积累从点滴开始

  :: 首页 :: 博问 :: 闪存 :: :: 联系 :: :: 管理 ::

ZJU1045-HangOver(解题来自《ACM国际大学生程序设计竞赛题解(1)》

【题目大意】

  你可以把一叠卡片放得离桌子多远?如果有一张卡片,那么可以达到的最远距离是卡片长度的一半。(假设卡片必须与桌子的边缘垂直。)使用两张卡片,使上面一张能放到的最远距离超过下面一张卡片长度的一半,而下面一张超过桌面的是卡片长度的1/3,所以能达到的最远距离是1/2+1/3=5/6的卡片长度。

  一般来说,n张卡片能达到的最远距离是1/2+1/3+1/4+...+1/(n+1),也就是最顶上的卡片超过第二张1/2,第二张超过第三张1/3,第三张超出第四张1/4,等等,最后一张超出桌子的1/(n+1)。如题目的图。

  输入有多组测试例,当一行是数字0.00时表示输入结束。每个测试例一行,是一个浮点数c(0.01<=c<=5.20),c刚好是3位数字。

  对每个测试例,输出达到距离c所需要的最少的卡片数量,输出格式如样例所示。

【算法分析】

  题目给出卡片超过桌子边缘所能达到的最远距离c,是一个浮点数,且保留2位小数,然后计算需要的最少的卡片数量n。计算公式是:

                                1/2+1/3+1/4+...+1/(n+1)<=c

  使用一个循环语句,逐渐累加,知道上式左边的和超过c时,就可以将n计算出来。

【代码如下】:

  

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    float c;
    while(scanf("%f",&c)&&c!=0)
    {
        int i=2;
        float result=0;
        while(result<=c)
        {
            result+=1.00/i;
            i++;
        }
        printf("%d card(s)\n",i-2);
    }
    return 0;
}

 

          

posted on 2013-05-07 23:17  CDU_ICPC  阅读(282)  评论(0编辑  收藏  举报