acm输入输出

这篇博客介绍了ACM竞赛中处理输入输出的方法,包括输入输出的重定向、多种输入方式以及输出的注意事项。强调了按照规定格式进行输入输出的重要性,并提供了针对不同情况的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入和输出处理
试题一般采用标准输入和输出方式读取输入和产生输出,在题目中会详细描述输入和输出的格式和值域范围,所写的程序一定要严格遵守题目指定的输入输出格式。

在比赛试题的输入和输出处理上,针对一些常见的情形,有一些常用的方法。

1、输入输出的重定向

一般用下面两种方法

c++常用:

#include<fstream.h>
ifstreamfilein("data.in");   // 定义一个文件输入流
ofstreamfileout("data.out"); //cout<< --> fileout<<
filein.eof() //文件到末尾,返回非零值

data.in表示输入的数据文件

本地测试的话本来输入的数据就要在这个文件里面测试了

建一个本地的文本data.in,可以用记事本的方式打开

注意:文件输入的话,以后的cin>>都要改成filein>>, cout<<都要改成fileout<<

 由于ACM竞赛题目的输入数据和输出数据一般有多组(不定),并且格式多种多样,所以,如何处理题目的输入输出是对大家的一项最基本的要求。这也是困扰初学者的一大问题。ACM的输入输出要求严格按照规定来,所以你不需要输出像"Pleaseinput the data"这类的提示语。否则将会被判Wrong Answer。

2、输入

初学者一般有个误区:如果题目包含多组测试数据,他们就会把输入的内容全部保存起来,然后再依次处理。

其实程序的输入\输出是相互独立的,因此,每当处理完一组测试数据,就应当按题目要求进行相应的输出操作。而不必将所有结果储存起来一起输出。 

下面来介绍一下ACM中常见的一些输入情况。
只有一组测试数据,这类题目是最简单的,参考代码:

#include<iostream>

using namespace std;

int main()
{
	int a, b; 
	cin>>a>>b;
	cout<<a+b<<endl; 
	return 0;
} 
没有明确指出输入什么时候结束,如果是这种情况,我们默认是以“文件结束”(EOF)为结束标志。这是ACM的默规,参考代码:

#include<iostream>

using namespace std;

int main()
{
	int a, b; 
	while(cin>>a>>b)
		cout<<a+b<<endl; 
	return 0;
} 

指定数据量 ,有时会在数据的第一行提供数据量大小,比如第一行是100,则表示有100组数据。参考代码:

#include<iostream>

using namespace std;

int main()
{
	int n,a,b; 
	cin>>n;
	while(n--)
	{
		cin>>a>>b;
		cout<<a+b<<endl;
	}
	return 0;
} 
以特定元素作结束符 ,这种输入和第一种类似。常见的是规定以0作为结束符。参考代码:

#include<iostream>

using namespace std;

int main()
{
	int a, b;
	while(cin>>a>>b, a||b)
	{
		cout<<a+b<<endl;
	}
	return 0;
}

3、输出

输出格式统一,这种比较简单,只要按要求来就没问题的。比如每组输出占一行,或者每组输出后面加一个空行。
数据之间有空行 
对于这种输出,有时候还会告诉你有几组输入,这样你就可以自己判断一下是不是最后一组。是就不输出空行,否则多输出一个空行。而有时候连共有几组数据都不会告诉你。其实不论知不知道有几组数据,我们都可以这样处理。

第一组数据后面不加空行。第二组开始,每组前面加空行。

关于C++的输入输出处理:

cin读字符串时遇到空白符(空格,换行等)结束
char str[BUFFER]; 
while (cin >> str) { 
} 
getline读字符串时遇到换行符结束,用于读一整行 
char str[BUFFER]; 
while (cin.getline(str, BUFFER)) { 
} 
string str; 
while (getline(cin, str)) { 
} 
cin/cout要比scanf/printf慢一些,尽可能使用scanf/printf以避免测试大量数据时因为输入输出慢而导致TLE.putchar/getchar要比scanf/printf更快
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值