首先说一下OJ平台的判题机制,OJ判题是黑盒测试,它并不关心程序的内容,只用程序的输出结果来判断是否正确。
OJ后台有两个文件,一个是输入文件,一个是输出文件。
你将代码提交上去后,OJ会运行你的代码,并将输入文件中的数据输入,如果你的代码的运行结果和输出文件完全一致,那么该代码通过,AC。
以 多组输入输出中 a + b 为例。
如果你的代码每组数据运行的结果和1.out完全一致,那么这道题就会判为AC。(注意只看输出内容)
下面说一下平常题目的输入输出格式:
常见的输入格式:
1.给定一个整数T, 然后接着输入T组数据
格式如下:
#include <stdio.h>
int main(){
int T;
int a,b;
scanf("%d",&T);
while(T--){
scanf("%d%d",&a,&b);
int c = a + b;
printf("%d\n",c) ;
}
return 0;
}
输入:
3
1 2
2 2
3 4
输出:
3
4
7
2.循环输入
(1):持续循环输入直到输入文件结尾(EOF)
#include <stdio.h>
int main(){
int T;
int a,b;
while(scanf("%d%d",&a,&b)!=EOF){
printf("%d\n",a+b);
}
return 0;
}
输入:
1 2
2 2
3 4
输出:
3
4
7
(2)假设直到a,b都等于-1,结束循环.
#include <stdio.h>
int main(){
int T;
int a,b;
while(scanf("%d%d",&a,&b)&&(a!=-1||b!=-1)){
printf("%d\n",a+b);
}
return 0;
}
输入:
1 2
2 2
3 4
-1 -1
输出:
3
4
7
(3)没有明确说明要输入多少个数据,需要在输入完数据后手动按 Ctrl + Z 强制结束输入 Ctrl + Z相当于是 EOF 所以退出循环
#include <stdio.h>
int main(){
int a,sum = 0;
while(scanf("%d",&a)!=EOF){
sum+=a;
}
printf("%d\n",sum);
return 0;
}
输入:
1 2 3 4 5 6 7
(按Ctrl + Z然后回车,强制结束循环)
输出:
28
(4) 如果题目要求输入多组数据,每组数据有多个数据,则先用一个循环控制输入多少组数据,然后在内部在用一个循环输入数据。
例如:输入T组数据,每组数组包含一个整数n, 随后给数组存入n个值。
int T;
scanf("%d",&T);
int a[10];
while(T--){
int n;
scanf("%d",&n);
int i;
for(i = 0; i < n; i++){
scanf("%d",&a[i]);
}
}
(5)特别的对于一些字符串相关的题,题目有时候会给出一行字符,这时候不能仅用'\n'来控制循环结束,一定要加上!=EOF
下面给出字符串常用的输入格式:
#include<stdio.h>
int main()
{
char ch;
while((ch=getchar())!=EOF)
{
if(ch=='\n') break;
......
}
return 0;
}
总结: 多组输入中循环控制条件分两种。
1.没有明确什么时候结束输入。
则采用while(scanf(...)!=EOF)
加!=EOF 是因为没有明确的循环结束条件时为了避免出现死循环,只能通过到达输入文件结尾的时候来结束循环,因为到达文件结尾后没有东西可供输入函数读取了,所以此时输入函数 如 scanf(), 就会返回 -1。 EOF在C语言的定义中就是-1 所当返回值等于EOF时,循环结束。
2.以特定元素作为结束标志,结束输入
如(2) 中 a和b都为-1时结束循环, 或者 遇到0时结束循环
则只需要加上给定的判断条件就行,视具体情况而定。
如 while(scanf("%d",&a,&b)&&(a!=-1||b!=-1))
常见的输出格式:
1.有若干行,每行只包含一组正确答案
上述代码都是这种情况,也就说输出一组答案后跟着输出换行;
如:
#include <stdio.h>
int main(){
int T;
int a,b;
while(scanf("%d%d",&a,&b)!=EOF){
printf("%d\n",a+b);
}
return 0;
}
2.所有答案均为一行,每个答案之间只有一个空格,且行末没有空格
#include <stdio.h>
int main(){
int T;
int a[10];
scanf("%d",&T);
for(int i = 0; i < T; i++){
scanf("%d",&a[i]);
}
sort(a,a+T);
for(int i = 0; i < T; i++)
i ? printf(" %d",c) : printf("%d",c); // 三目运算符 相当于 if(i!=0) printf(" %d",c);
// else printf("%d",c);
return 0;
}
输入:
3
1 2
2 2
3 4
输出:
3 4 7
3. 每个输出前加上一些标记, 标志第几组数据,例如:
#include <stdio.h>
int main(){
int T;
int a,b;
scanf("%d",&T);
int i = 0;
for(i = 1; i <= T; i++){
scanf("%d%d",&a,&b);
int c = a + b;
printf("Case %d: %d\n",i,c);
}
return 0;
}
输入:
1 2
2 2
3 4
输出:
Case 1: 3
Case 2: 4
Case 3: 7
4.每输出n个数换行。
例如 输出 1 ~ 100的所有值,每输出10个数换行。伪码如下
for(i = 1; i <= 100; i++){
printf("%d ",i);
if(i%10==0) printf("\n");
}
这些都是非常基础的知识,如果刚开始不懂,就多做几道题吧。