(以“ 分类:整数处理 ==摘要== {{信息题|A + B Problem|http://acm.hust.edu.cn/vjudge/contest/view.action?cid{{=}}68572#problem/A|1|100|输出格式|0|time=201...”为内容创建页面) |
小 (→代码: 加入拓展阅读) |
||
(未显示1个用户的2个中间版本) | |||
第3行: | 第3行: | ||
==摘要== | ==摘要== | ||
{{信息题|A + B Problem|http://acm.hust.edu.cn/vjudge/contest/view.action?cid{{=}}68572#problem/A|1|100|输出格式|0|time=2015-02-06 10:26:13}} | {{信息题|A + B Problem|http://acm.hust.edu.cn/vjudge/contest/view.action?cid{{=}}68572#problem/A|1|100|输出格式|0|time=2015-02-06 10:26:13}} | ||
− | * | + | *来自寒假练习:[http://acm.hust.edu.cn/vjudge/contest/view.action?cid=68572 Only a signing tool !] A题 |
*原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1000 | *原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1000 | ||
+ | |||
==题意== | ==题意== | ||
多行A+B。 | 多行A+B。 | ||
==题解== | ==题解== | ||
− | *本来A+ | + | *本来A+B不想写题解……可是居然WA了那么多次。先不说第一眼没看到多行,后来WA的几次不能理解。照理说,对于不限制输入数据个数的,本来以为以下两种写法应该都Acceptable,但是只有最后交的一种能A,后来发现多少是有bug的。 |
+ | ===第一种错误写法=== | ||
while(!cin.eof()) | while(!cin.eof()) | ||
{ | { | ||
第15行: | 第17行: | ||
cout<<a+b<<endl; | cout<<a+b<<endl; | ||
} | } | ||
− | + | 有些情况的确是Acceptable的,但是有时候不行,原因似乎很复杂,大概是: | |
+ | 《C++ IO流及本地化》:“非单个字符的数据抽取:如果你不是按字符方式抽取,而是抽取一个整数或一个字符串或其他由多个字符组成的数据项,你就可能有超过输入序列结束符进行读操作的情况。 | ||
+ | 这是因为输入运算符要连续读入字符,直到遇到分隔符或遇到输入序列结束符为止。 | ||
+ | 假设输入序列是“...912749<eof>” | ||
+ | 要抽取整数,那么抽取符将读入所有数字字符直到收到遇到输入序列结束符的信息。 | ||
+ | 然后抽取符停止操作并设置标志eofbit,因为,此时抽取符已经试图超过输入序列结束符进行读操作。” | ||
+ | 也就是说如果最后一个数后面没有空白,读完最后一个数的同时,状态位就被设成EOF了。有回车的话就不会了<ref>http://poj.org/showmessage?message_id=48711</ref> | ||
+ | ===第二种错误写法=== | ||
while(scanf("%d%d",&a,&b)) | while(scanf("%d%d",&a,&b)) | ||
printf("%d\n",a+b); | printf("%d\n",a+b); | ||
+ | 这种应该改成 | ||
+ | while(scanf("%d%d",&a,&b)>0) | ||
+ | printf("%d\n",a+b); | ||
+ | 原因是scanf文件末尾返回的是-1,以下为scanf的返回值<ref>http://www.douban.com/note/220299804/</ref>: | ||
+ | 1) 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b); | ||
+ | 如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量); | ||
+ | 如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。 | ||
+ | 2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。 | ||
+ | 3) EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复2次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。 | ||
+ | |||
==代码== | ==代码== | ||
{{折叠|1000.cpp代码已折叠 | {{折叠|1000.cpp代码已折叠 | ||
第34行: | 第53行: | ||
</pre> | </pre> | ||
|code1000}} | |code1000}} | ||
+ | ==参考资料和拓展阅读== | ||
+ | <references/> |
题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
---|---|---|---|---|---|
A + B Problem | ★☆☆☆☆ | 答案正确 | 100 | 2015-02-06 10:26:13 | 输出格式(0) |
多行A+B。
while(!cin.eof()) { int a,b; cin>>a>>b; cout<<a+b<<endl; }
有些情况的确是Acceptable的,但是有时候不行,原因似乎很复杂,大概是:
《C++ IO流及本地化》:“非单个字符的数据抽取:如果你不是按字符方式抽取,而是抽取一个整数或一个字符串或其他由多个字符组成的数据项,你就可能有超过输入序列结束符进行读操作的情况。 这是因为输入运算符要连续读入字符,直到遇到分隔符或遇到输入序列结束符为止。 假设输入序列是“...912749<eof>” 要抽取整数,那么抽取符将读入所有数字字符直到收到遇到输入序列结束符的信息。 然后抽取符停止操作并设置标志eofbit,因为,此时抽取符已经试图超过输入序列结束符进行读操作。”
也就是说如果最后一个数后面没有空白,读完最后一个数的同时,状态位就被设成EOF了。有回车的话就不会了[1]
while(scanf("%d%d",&a,&b)) printf("%d\n",a+b);
这种应该改成
while(scanf("%d%d",&a,&b)>0) printf("%d\n",a+b);
原因是scanf文件末尾返回的是-1,以下为scanf的返回值[2]:
1) 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b); 如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量); 如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。 2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。 3) EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复2次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。
1000.cpp代码已折叠
展开折叠内容
|
---|
#include<iostream> using namespace std; int main() { int a,b; while(cin>>a>>b) { cout<<a+b<<endl; } return 0; } |