ACM的输入问题

while(~scanf("%d",&n))和while(scanf("%d",&n))有什么区别,为什么用后者超时的时候换成前者就能AC了... while(~scanf("%d",&n))和while(scanf("%d",&n))
有什么区别,为什么用后者超时的时候换成前者就能AC了
展开
 我来答
icso
推荐于2018-04-19 · TA获得超过650个赞
知道小有建树答主
回答量:242
采纳率:0%
帮助的人:425万
展开全部
一般来说,OJ在测试的时候会将一个文本文件重定向到标准输入(stdin),这样,在输入文件结束时,scanf()会返回一个文件结束符EOF,这个结束符的值是-1。
了解机内码表示法的话,应该知道,-1在内存中的二进制值的各个位上全为1,按位取反后刚好为0。
所以,前一种写法,当且仅当输入结束时结束循环,而后一种写法在遇到文件结束符时无法退出循环。
xiezhunbenben
2013-02-17 · TA获得超过169个赞
知道小有建树答主
回答量:210
采纳率:0%
帮助的人:127万
展开全部
你没明白为何要写这样的while循环! 一般acm的题目都是有多组测试数据,然后一般每组都是先输入一些数据然后要你输出结果所以一般会出现如上的while循环结构! 这样写是利用了scanf 函数的返回值!即你读取了多少个数据就会返回几!所以当输入测试数据结束时scanf返回值就会返回特定的值,因为一般测试数据时保存在文件中的,所以一般到最后返回的是EOF,然后就是楼上说的那样了!
还有个人建议写成如下形式:

while(scanf("%d", &n) == 1) 一般写成这样的形式比较好点.
追问
我问的是为什么多个~就能避免超时了,你有回答重点么?
追答
虽然没有直接说出但是间接的告诉你了!你要是还是不能理解那就是你的问题了!不要用你自己的愚蠢来质问我!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
忘川漱石
2013-02-16 · TA获得超过131个赞
知道答主
回答量:137
采纳率:0%
帮助的人:109万
展开全部
scanf()读到输入的结尾时返回值是EOF
一般EOF的值是-1,而不是0
~是按位取反,~(-1)=0
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式