杭电 A+B for Input-Output Practice

对于初学者来说,了解一个编译环境,并能按照题目的要求来有效地输入输出是很重要的,接下来,我将分享以杭电系统为基础的相关内容:

第一题

那么肯定有小伙伴说,这个那么简单,谁都可以啦,你的代码是不是和下面的一样~( ̄▽ ̄)~*

#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时,你就要注意啦,你肯定是哪里的输出的格式不符合要求,仔细看题修改就可以啦!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值