对于初学者来说,了解一个编译环境,并能按照题目的要求来有效地输入输出是很重要的,接下来,我将分享以杭电系统为基础的相关内容:
第一题
那么肯定有小伙伴说,这个那么简单,谁都可以啦,你的代码是不是和下面的一样~( ̄▽ ̄)~*
#include<stdio.h>
int main()
{
int a,b;
while(scanf("%d%d",&a,&b))
{
printf("%d\n",a+b);
}
return 0;
}
哈哈,要是你按照这个去提交,那就Time limit Exceeded啦
你再看看下面Accepted的代码
#include<stdio.h>
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
printf("%d\n",a+b);
}
return 0;
}
没错啦,就是多了一个“!=EOF",
那么就有人疑惑啦,怎么差别那么大?
杭电系统中,数据是用文件的形式输入的,而“EOF"表示”end of file",表示当前文件已经结束,如果不加" != EOF",就没有明显的数据终止输入标志,那么这个程序就是个死循环,会一直运行下去,最终导致超时。
现在来补充一下scanf("%d%d",&a,&b)该语句的返回值,
如果a和b都被成功读入,那么上面表达式的结果为2;
如果只有一个读入,那么上面表达式的结果为1;
如果a&&b都没有读入,那么上面表达式的结果为0(若a没有读入,则直接放弃b的读入);
如果遇到错误或者文件结尾,那么上面表达式的结果为EOF,对应的有符号数时-1;
什么时候输出EOF? 在stdio.h中 宏定义为-1
按照说明,scanf函数只有在第一个参数为NULL(空指针)的情况下,才可能返回EOF,否则,返回成功格式化并赋值的参数个数(>=0)。
下面来看第二题
与上一题不一样,该题有明确的输入终止标准n,话不多说,直接上代码
#include<stdio.h>
int main()
{
int n,a,b;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
}
return 0;
}
所以有了明确的输入终止标准就不用使用!=EOF啦
再接再接力,再看第三题
这次的输入终止标志并不是具体的次数,而是对输入内容的判断,只要每次判断就可以啦!
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
while(a!=0||b!=0)
{
printf("%d\n",a+b);
scanf("%d%d",&a,&b);
}
return 0;
}
再来看第四题
这一题又不一样啦,相信聪明的你可以解决的啦!
#include<stdio.h>
int main()
{
int n,a,sum;
scanf("%d",&n);
while(n>0)
{
sum=0;
while(n--)
{
scanf("%d",&a);
sum+=a;
}
printf("%d\n",sum);
scanf("%d",&n);
}
return 0;
}
是不是很简单呢?
那么来看第5题
那就升级一下吧,这道题是3,4题的结合,代码差不多啦
#include<stdio.h>
int main()
{
int N,n,a,sum;
scanf("%d",&N);
while(N--)
{
scanf("%d",&n);
while(n>0)
{
sum=0;
while(n--)
{
scanf("%d",&a);
sum+=a;
}
printf("%d\n",sum);
scanf("%d",&n);
}
}
return 0;
}
话不多说,上第六题
是不是小意思啦!
#include<stdio.h>
int main()
{
int n,a,sum;
while(scanf("%d",&n)!=EOF)
{
if(n<=0)
break;
sum=0;
while(n--)
{
scanf("%d",&a);
sum+=a;
}
printf("%d\n",sum);
}
return 0;
}
来第七题
可能有同学会说啦,这不是第一题吗?哈哈,就知道你这么说,仔细看,输出格式不一样的啦!
#include<stdio.h>
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
printf("%d\n\n",a+b);
}
return 0;
}
只用多加一个换行就可以啦!
来个稍微难一点的
看第八题
#include<stdio.h>
int main()
{
int N,n,i,j,a,sum;
scanf("%d",&N);
for(i=0;i<N;i++)
{
sum=0;
scanf("%d",&n);
for(j=0;j<n;j++)
{
scanf("%d",&a);
sum+=a;
}
if(i<N-1)
printf("%d\n\n",sum);
else
printf("%d\n",sum);
}
return 0;
}
注意看,为什么我这里又改用for 来控制循环呢?
总的来说,for进行控制的循环形式上更加简洁,更有利于用来控制有明显循环次数条件的循环
再杭电系统上,当出现presentation error时,你就要注意啦,你肯定是哪里的输出的格式不符合要求,仔细看题修改就可以啦!