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; }