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 题目截图
这道题是输入两个整数,计算它们的和并输出,每个结果占一行(有多对输入数据)。
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:如果本文对您有帮助,请点个赞让我知道哦~