描述
你能让一叠卡片悬在桌子上多远?如果您有一张卡,则可以创建卡长度半个的最大悬垂。使用两张卡,您可以使顶部卡悬垂到底部一张卡上,使底部悬垂一张卡长度的三分之一,使表上悬一半,总最大悬伸为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,最多为5.20;c 将正好包含三位数字。
输出
对于每个测试用例,输出实现至少 c 卡长度悬垂所需的最小卡数。使用示例中所示的确切输出格式。
代码:
#includeusing namespace std; int main(){ float m; while (cin >> m && m != 0.00F ){ float sum = 0; int j = 1; while (true) { sum += 1.0/(j + 1); //得出长度和,进行比较与输出; if (sum > m) { break; } ++j; } cout << j << ' ' << "card(s)" << endl; } }
PS.
在这一题目中,我遇到的第一个问题是循环输入的问题,我第一个想到的是用最熟悉的for循环,如下:
#include#include using namespace std; int main(){ vector length; for(int i = 0; ; i++){ // 循环输入数据,直到遇到0.00,并将数据放入length数组中; float m; cin >> m; length.push_back(m); if( m == 0 ){ break; } }
这里出现了两个问题,第一是明显这串代码不够简洁;第二,我找不到他的问题,但这一串输入结束后不会自动输出。如果之后解决了这个问题我会贴出相关代码。
我第二种方式是从网络上看到的,部分人在用的cin.peek() != ' ',代码如下:
#include#include using namespace std; int main(){ vector length; while (cin.peek() != '0'){ float m; cin >> m; length.push_back(m); }
这里也存在问题,其一是peek() != ' '中,单引号中的为字符类型,而我的输入中为float类型,和它八字不合,所以这个方法也say no了。
最后就是我最终代码中的内容,这样的代码形式下,在编译器中的输出与输入可能与描述不太相符——它是分别输入和输出的,即输入与输出是一对一对的生成的,遇到0.00时结束程序。
#includeusing namespace std; int main(){ float m; while (cin >> m && m != 0.00F ){ ...... } }
这样的输入与输出方式在POJ中是行得通的,在C++的学习中,cout的方向是“屏幕”,这种“方向”是可以根据需要进行更改的。而在编译器的眼中,我们的输出是在一个类似于“output.txt”的文件中放置,是与我们的输入分开的。
所以这种形式是它所允许的。关于这种形式在考试中的使用,老师提起时是说可以的,不妨一试,反正就算不行的话,把循环改写到外面也不会费很大的事。