杭电OJ 1000 A + B Problem
题目内容
Limit
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/32768 K (Java/Others)
Problem Description
Calculate A + B.
Input
Each line will contain two integers A and B. Process to end of file.
Output
For each case, output A + B in one line.
Sample Input
1 1
Sample Output
2
题目解析:
这是杭电的第一道题,题目讲的是接收两个整数并返回两个数的和。
值得注意的是,题目中说明了每行两个数据,但并没有说明多少行。这种情况换一种常用说法叫:“多组数据”,是常见的要求。不过对于新手而言,自己明白这一点是几乎不可能的,没有C语言算法书会写明接收多组数据的方式。
我的代码:#include
int main()
{
int a,b;
while(~scanf("%d %d",&a,&b)) //多次输入a和b。
{
printf("%d\n",a+b);
}
}
运行情况:运行时长: 0 MS 占用内存: 1560 K 代码长度: 129 B
代码解析:
大部分代码对于学过C语言的人而言没有难度,难点在于下面的一句话while(~scanf("%d %d",&a,&b)) //多次输入a和b。
这句话中的“~”符号可以理解为“重复”,代码含义是反复执行 scanf(“%d %d”,&a,&b) 语句,直到语句接收不到有效结果。
换一种说法就是while语句会在括号中的判断为真的情况执行语句,那么对于scanf函数而言,判断为真也就是接收到了有效数据。而~符号代表无限重复,直到scanf语句不能取到有效的值为止(while的括号中判断为假),循环跳出。
另一种读取任意次数据的写法是:while(scanf("%d %d",&a,&b)!=EOF) //另一种写法
EOF的含义是文件结束符(end of file)。在while循环中以EOF作为文件结束标志,也就是说,用scanf函数读取数据,直到遇到文件结束。
程序如果采用文件读取来接收数据的话,这种以EOF作为文件结束标志的文件必须是文本文件。(因为ASCII代码值的范围是0~255,不可能出现-1,因此才可以用EOF作为文件结束标志。)
更多信息:
有人可能会这么写接收多组数据:#include
int main()
{
int a,b;
while(1)
{
scanf("%d %d",&a,&b);
printf("%d\n",a+b);
}
}
这样写的意思是无限接收数据,问题在于这样写的话虽然结果不会有错,但函数会一直不能正常结束,当到达数据内容的最后以后,会遇到 scanf(“%d %d”,&a,&b); 一句读不到数据的问题,这时函数就是停滞等待下一个数据,当然,如果这个时候遇到EOF也可能正常结束。
无论如何,这样写是不好的。在本博客中,笔者会用使用~符号的代码写法编写代码。
文档信息:
[1] 第一次上线:2015年6月27日20:45:00
[2] 修改了部分标题格式,未对内容进行修改:2015年6月27日20:59:50