C++.POJ_1003

发布于:2022-08-08 ⋅ 阅读:(307) ⋅ 点赞:(0)

描述

你能让一叠卡片悬在桌子上多远?如果您有一张卡,则可以创建卡长度半个的最大悬垂。使用两张卡,您可以使顶部卡悬垂到底部一张卡上,使底部悬垂一张卡长度的三分之一,使表上悬一半,总最大悬伸为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 卡长度悬垂所需的最小卡数。使用示例中所示的确切输出格式。

代码:

#include <iostream>

using 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 <iostream>
#include <vector>

using namespace std;

int main(){
	vector<float> length;
	for(int i = 0; ; i++){     // 循环输入数据,直到遇到0.00,并将数据放入length数组中;
		float m;
		cin >> m;
		length.push_back(m);
		if( m == 0 ){
			break;
		}
	}

这里出现了两个问题,第一是明显这串代码不够简洁;第二,我找不到他的问题,但这一串输入结束后不会自动输出。如果之后解决了这个问题我会贴出相关代码。

我第二种方式是从网络上看到的,部分人在用的cin.peek() != ' ',代码如下:

#include <iostream>
#include <vector>

using namespace std;

int main(){
	vector<float> length;
	while (cin.peek() != '0'){
		float m;
		cin >> m;
		length.push_back(m);
		} 

这里也存在问题,其一是peek() != ' '中,单引号中的为字符类型,而我的输入中为float类型,和它八字不合,所以这个方法也say no了。

最后就是我最终代码中的内容,这样的代码形式下,在编译器中的输出与输入可能与描述不太相符——它是分别输入和输出的,即输入与输出是一对一对的生成的,遇到0.00时结束程序。

#include <iostream>

using namespace std;

int main(){
    float m;
	while (cin >> m && m != 0.00F ){
		       ......
	}    
}

这样的输入与输出方式在POJ中是行得通的,在C++的学习中,cout的方向是“屏幕”,这种“方向”是可以根据需要进行更改的。而在编译器的眼中,我们的输出是在一个类似于“output.txt”的文件中放置,是与我们的输入分开的。

所以这种形式是它所允许的。关于这种形式在考试中的使用,老师提起时是说可以的,不妨一试,反正就算不行的话,把循环改写到外面也不会费很大的事。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到