杭电OJ题目 1000

杭电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

你可能感兴趣的:(杭电题目个人解答)