北京交通大学 计算思维与算法实训平台

OJ输入输出教程

kf11 创建于 18/3/1 20:29 修改于 18/5/13 22:15

1 引言

在OJ上,绝大部分题目通常会预先生成好输入输出数据,通常储存在.in和.out文件当中。
当一份代码提交上后,应通过标准输入按预先说明的输入格式,从.in文件中读入输入数据,程序再运行程序生成标准输出,接着将程序的输出数据和预生成好的输出进行对比。如果输出数据和预生成好的输出进行对比完全一样则返回Accept。(这里没考虑runtime error, Time limit error等等情况)
这是Online Judge判断程序的大致过程。其中对比是非常严格的,要完全一样才会返回Accept,部分OJ对比时会忽略行末空格和文末回车
所以如果你的答案不正确,或和要求输出的格式不同(部分可能返回PE),或者有任何多余输出那么是会Wrong Answer的。比如在程序中写 puts(“请输入n”) 这种语句会导致Wrong Answer。
Ps: 当题目有多解的时候,通过Special Judge来判断,只有输入文件,通过一个验证程序来判断输出是否正确,但是输出也要按照格式来。

2 常见输入形式

通常每题都会给输入输出的格式要求。
下面以求A+B为例子来说明部分常见输入形式。

再次强调输入输出需严格按照指定的格式要求
再次强调输入输出需严格按照指定的格式要求
再次强调输入输出需严格按照指定的格式要求

重要的事情说三遍

2.1 读入一组数据

Input: //输入格式
一行包含两个整数a,b
Output: //输出格式
一行包含一个数字,表示a+b
直接处理即可
C版本:

int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", a + b);

C++版本:

int a, b;
cin>>a >>b;
cout <<a + b <<endl;

2.2 多组数据,并告诉了数据个数

先读入数据组数,再循环处理即可。
Input:
第一行包含一个整数T(T < 10),表示共有T组测试用例
接下来T行 每行两个整数a,b
Output:
对于每个测试用例,在一行中打印一个整数表示a+b
C版本:

int T; scanf("%d", &T);
for (int i = 0; i < n; i ++){
  int a, b;
  scanf("%d%d", &a, &b);
  printf("%d\n", a + b);
}

C++版本:

int T; cin >>T;
for (int i = 0; i < n; i ++){
  int a, b;
  cin>>a >>b;
  cout <<a + b <<endl;
}

2.3 多组数据,但是不知道数据个数

不断循环读入数据,直到文件尾位置。
Input:
输入包含多组测试用例,对于每组数据输入两个整数a,b
Output:
对于每个测试用例,在一行中打印一个整数表示a+b
C版本:

int a, b;
while (scanf("%d%d", &a, &b) != EOF)
  printf("%d\n", a + b);

C++版本:

int a, b;
while (cin >> a >> b)
  cout << a + b <<endl;

Ps:不熟悉scanf和cin返回值的同学可以看看百度百科

3 关于C++的输入输出说明

C++使用的cin和cout,当读入大量数据时,与C语言的scanf相比速度极慢,甚至可能会导致Time limit error
此时可以将如下语句加在程序最开始运行的地方,来关闭流同步,使得效率大幅提升,

ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);

使用这条语句后,不要再混用任何C与C++方式的输入输出,比如同时使用cin,scanf。否则会导致Wrong Answer。

4 部分数据类型的C输入输出方式

下面说明几种数据类型scanf时的读入方式,C++使用 cin,cout时会自动识别类型故不再赘述。

4.1 long long

scanf使用%I64d或%lld进行读入long long。printf同理。
例如:

long long a;
scanf("%lld", &a);

ps: int的范围为-2,147,483,648 到2,147,483,647 (2^31 - 1)
long long的范围为-9223372036854775808到9223372036854775807(2^63 - 1)
需要更大范围的话可以了解一下高精度

4.2 double

scanf使用%lf,例如:

double a;
scanf("%lf", &a);

printf输出时可以通过如下方式来控制小数点后数位。
%.xlf(其中x表示位数)。
例如printf(“%.3lf\n”, a)则会输出三位小数

4.3 long double

使用%Lf,其余与double相同 (L为大写)

4.4 char

使用%c,例如

 char ch;
scanf(“%c”, ch);

4.5 字符串

%s,这里实际读入的是一个字符数组,所以后面得传入的是个指针,以空格和回车作为分隔。例如:

char a[100];
scanf("%s", a);

4.6 string

String是C++的STL需使用cin读入;

string s;
cin>>s;

4.7 读入一行

4.7.1 读入到字符串

使用gets方式如下:

char s[100];
gets(s);

4.7.2 读入到string

使用getline。
从标准输入流读入方式如下:

string s;
getline(cin, s);