HDOJ 1000A + B Problem最短代码探索

0x00 前言

这道题估计是HDOJ里最简单的了,不亦要挑战的是怎样用最短的代码AC它。
看了下HDOJ支持的编程语言,有C、C++、Java、Pascal和C#,对比了下,在这个场景C语言应该是最短的了。
那么,为了方便测试,直接用在线的C语言编辑器了。
在线编程调试 http://www.dooccn.com/c/
A + B Problem原题 http://acm.hdu.edu.cn/showproblem.php?pid=1000

0x01 题目截图

A + B Problem
这道题是输入两个整数,计算它们的和并输出,每个结果占一行(有多对输入数据)。

0x02 最初写法

#include<stdio.h>
int main(){
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF){
        printf("%d\n",a+b);
    }
    return 0;
}

代码长度137B

简化写法

#include<stdio.h>
int main(){int a,b;while(scanf("%d %d",&a,&b)!=EOF){printf("%d\n",a+b);}return 0;}

把换行和空格去掉(第一行后面的换行不能去掉,不然编译会出错),简化后代码长度101B

00x3 用~代替EOF

#include<stdio.h>
int main(){
    int a,b;
    while(~scanf("%d %d",&a,&b)){
        printf("%d\n",a+b);
    }
    return 0;
}

简化后代码长度97B

while(~scanf("%d",&n)) <=> while(scanf("%d",&n)!=EOF)

  • 正常输入的时候,scanf返回输入的数字如1,2,3等等,对这些数字取非,不会成为0,就会执行循环;
  • 错误输入指的就是没有输入的时候,scanf返回的是EOF(End Of File),EOF=-1,对EOF取非,就是对-1取非

~是位运算,它是将数据在内存中的每一位(当然是二进制)取反。-1在内存中所有位全部为1,~(-1)=0,即对-1取非就是0,就会跳出循环。(摘自《~scanf()简析》http://blog.csdn.net/wtyvhreal/article/details/42006055)

0x04 用for循环代替while循环

#include<stdio.h>
int main(){
    int a,b;
    for(;~scanf("%d %d",&a,&b);printf("%d\n",a+b));
    return 0;
}

for循环内第一个分号前语句执行一次,第二个分号前是判断继续循环的条件,第二个分号后是每次循环执行的语句,有多个语句则用逗号分开。
简化后代码长度95B。

0x05 充分利用for循环初始化语句

#include<stdio.h>
int main(){
    for(int a,b;~scanf("%d %d",&a,&b);printf("%d\n",a+b));
    return 0;
}

把变量a,b的声明放在for循环初始化语句中内,简化后代码长度94B。

0x06 讨论区代码

#include<stdio.h>
main(){for(int a,b;~scanf("%d%d",&a,&b);printf("%d\n",a+b));}

把scanf里的空格省略,int和return省略,简化后代码长度为80B。
试了下,C语言main函数能省略返回值,C++不行。

0x07 大家有更简短的代码么?一起讨论下 :)

【转载请注明出处: http://blog.csdn.net/leytton/article/details/79444078
PS:如果本文对您有帮助,请点个赞让我知道哦~微笑

posted @ 2018-03-05 12:51  Leytton  阅读(219)  评论(0编辑  收藏  举报