@Chobi15
2016-11-21T21:47:10.000000Z
字数 3197
阅读 9816
未分类
下面列的细节是新生很容易出错的地方,读完这些如果还不能解决你的问题请在群体提出或私聊管理员。
每一道题目都会有Input,Output这两个部分,这两个部分告诉你题目会以怎样的格式给你数据,然后你需要按照什么格式输出答案,然后Sample Input,Sample Output会给你一些测试数据帮你理解题目。
交一个题目的前提条件至少是你的程序能够正常编译运行,并且向程序输入样例输入时,结果和样例输出一模一样
不要额外输入或输出无关信息!!
以这道A+B题目为例
Input:
The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.
Output:
For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.
Sample Input:
1 5
10 20
Sample Output:
6
30
//错误代码示范:
//错误代码示范:
//错误代码示范:
... 其余代码
printf("请输入两个整数");//错误原因:我们必须按照题目的格式来输入输出,不能额外输出任何东西,这句话得删掉
scanf("%d,%d", &a, &b);//错误原因:大多数题目的数据是用空格分隔两个数,这样读入会错 直接scanf("%d%d");即可
... 其余代码
printf("ans = %d\n", ans);//错误原因:题目要求只要求输出两个数的答案数值,"ans = "是额外信息,提交上去会错。应该这样printf("%d\n",ans);
//如果还有疑问,没关系,继续向下阅读。
... 其余代码
有些题目描述可能会包含上面这一句话,或者类似的语句。这些题目数据组数不止一组,意思就是你需要同时对于多组数据进行计算得到答案。具体细节后面会讲到。
无论输入还是输出描述都可能会看到这个词。比如“每一行答案占一行”,这个时候假设答案是ans,那么我们输出答案的时候就得这样:printf("%d\n",ans);
,再比如如果让你输出两个答案,并且之间空一行,你就得printf("%d\n\n%d\n", ans1, ans2);
,以此类推。
scanf读入数值或字符串的时候会忽略输入中的(Tab,回车,空格),所以读入两个以空格或者换行符分隔开的整数scanf("%d%d", &a, &b);
这条语句都可以办到。
如果我们要读入三个用空格或者换行分开的字符a,b,c,推荐这样读入
char s1[10], s2[10], s3[10];
scanf("%s%s%s",s1, s2, s3);
//这个时候 s1[0],s2[0],s3[0],就分别是字符a,b,c了,并不需要考虑他们用什么分隔,很方便
我们的题目拿到OJ去判题你可以理解为输入输出是从文件读入,就相当于在main函数里面加入下面这两句语句。
freopen("in", "r", stdin);
freopen("out", "w", stdout);
可能你并不懂这两句话的意思,但只需要记住输入和输出是分开的,只要我输出的信息是按照题目格式就没有问题,这和什么时候输出答案没关系。比如现在要求你计算两组数a+b和c+d的答案两个答案每个答案占一行,那么下面两个代码都是等效并正确的
//假设a=1,b=2,c=3,d=4。
//下面是第一份代码
int a, b, c, d;
scanf("%d%d", &a, &b);
printf("%d\n", a+b);//注意每个答案占一行,所以得\n
scanf("%d%d", &c, &d);
printf("%d\n", c+d);//注意每个答案占一行,所以得\n
//下面是第二份代码
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
printf("%d\n%d\n", a+b, c+d);//注意每个答案占一行,所以得\n
//上面两份代码最后 在out文件里面都是下面的样子
3
7
//以上是out文件的样子
//以下是如果没有在每个答案后面打\n的out文件
37
//以上是out文件的样子
OJ会比对你程序执行后的out文件和标准答案的out文件,out文件完全一致就会判定为答案正确。所以少打或多打一个换行符,空格符,以及其他任何字符都会显示答案错误。
EOF是end of file的简称,当我们用scanf函数从文件读入数据时,如果已经读到文件末尾之后没有信息了,那么scanf的返回值就是EOF(scanf也是一个函数,也有返回值,具体可以百度或看书),我们可以通过这个来判断题目数据是否已经读完,具体可看下面的题解,有详细例子。
或许大家会有这样的疑问,为什么我程序在我的电脑上运行正确,但是交到OJ上就显示错误,明明我的代码是“正确”的!!
每一道题目,他的输入数据不仅仅只有题目上的那些,还有很多很多数据,你需要考虑到每一种情况下你都能得到正确答案,这样你的代码才能得到一个Accept,加油!!
A+B for Input-Output Practice (I)
#include<stdio.h>
int main()
{
int a, b;
while(scanf("%d%d", &a, &b)!=EOF){//当scanf返回值不为EOF代表还有数据,所以就得计算并输出答案
printf("%d\n", a+b); //每个答案一行所以%d后要跟一个\n
//注意只要输出的信息拼凑起来的文件和答案的out文件一模一样就可以,所以我们可以边读入边输出答案
//不需要把答案都统计起来一起输出
//当然如果你知道out文件是啥你完全可以不用计算直接输出这个文件包含的信息(:-D
}
return 0;
}
A+B for Input-Output Practice (II)
int main(){
int n,a, b;
scanf("%d", &n);
while(n--){//循环n次
scanf("%d%d",&a,&b);
printf("%d\n", a+b);
}
return 0;
}
A+B for Input-Output Practice (III)
int main(){
int a, b;
while(1){
scanf("%d%d", &a,&b);
if(a == 0 && b == 0)break;//a,b都为0时直接跳出循环结束程序
printf("%d\n",a+b);
}
return 0;
}
A+B for Input-Output Practice (VII)
int main(){
int a,b;
while(scanf("%d%d",&a,&b)!=EOF){
printf("%d\n\n", a+b);//注意两个回车符达到空一行效果
}
return 0;
}