c++第二遍scanf读入问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++第二遍scanf读入问题相关的知识,希望对你有一定的参考价值。
我们acm上机练习要求用scanf输入,我是菜鸟啊。cin的输入会测试超时;
题目要求就是一个9位字符串。每三位作为一个三位数,要求前两个相加等于第三个,如果是输出YES,否则NO。
例如输入100100200,100+100=200,所以输出YES。
我用cin的话不会错,可是scanf第一遍结果正确,可是第二遍输入就会错误,我是菜鸟实在不懂不懂,求教。以下是我写的代码,我很努力了!
顺便我想了解一下这是为啥,第二遍读入时我之前测试了下各个char数据,char的读入都不对了,求助。
#include<iostream>
#include<cstdio>
int main()
char a[3],b[3],c[3];
int x,y;
while(scanf("%c",&a[0]))
scanf("%c",&a[1]);
scanf("%c",&a[2]);
scanf("%c",&b[0]);
scanf("%c",&b[1]);
scanf("%c",&b[2]);
scanf("%c",&c[0]);
scanf("%c",&c[1]);
scanf("%c",&c[2]);
x=100*(a[0]+b[0])+10*(a[1]+b[1])+1*(a[2]+b[2])-'0'*222;
y=100*c[0]+10*c[1]+1*c[2]-'0'*111;
if(x==y) printf("YES\n");
else printf("NO\n");
printf("%d %d\n",x,y);
a[0]='0';
return 0;
你第一次输入结束时 肯定按了回车 这就缓存了个换行符 下次输入的时候直接把换行符给了a[0]
while(scanf("%c",&a[0]))
scanf("%c",&a[1]);
scanf("%c",&a[2]);
scanf("%c",&b[0]);
scanf("%c",&b[1]);
scanf("%c",&b[2]);
scanf("%c",&c[0]);
scanf("%c",&c[1]);
scanf("%c",&c[2]);
getchar();
添一个getchar() 取出换行符应该就米事鸟 参考技术A int a,b,c;
scanf("%3d%3d%3d",&a,&b,&c);
if (c == a+b) printf("Yes"); else printf("No");
(printf 也可 cout )。 参考技术B 确实加了getchar();就没事了
#include<iostream>
#include<cstdio>
int main()
char a[3],b[3],c[3];
int x,y;
while(scanf("%c",&a[0]))
scanf("%c",&a[1]);
scanf("%c",&a[2]);
scanf("%c",&b[0]);
scanf("%c",&b[1]);
scanf("%c",&b[2]);
scanf("%c",&c[0]);
scanf("%c",&c[1]);
scanf("%c",&c[2]);
getchar();
x=100*(a[0]+b[0])+10*(a[1]+b[1])+1*(a[2]+b[2])-'0'*222;
y=100*c[0]+10*c[1]+1*c[2]-'0'*111;
if(x==y) printf("YES\n");
else printf("NO\n");
printf("%d %d\n",x,y);
a[0]='0';
return 0;
读入优化与输出优化
C++是一门神奇的学科。。。
在读入/输出时,我们经常用到:
scanf , cin , printf , cout
但是,在算法竞赛中,我们奉行一个原则:
效率第一!
于是,便产生了各种各样的奇技淫巧。。。
下面的读入与输出优化就是其中之一。
读入优化:
C++自带的 scanf 已经很快了,但是100W的数据要0.6~0.8s,很明显,还是慢了。
为什么?因为 scanf 带了许多厉害但是我们不需要的的特判。
于是,读入优化破壳而出:
inline int read(){ int date=0,w=1;char c=0; while(c<‘0‘||c>‘9‘){if(c==‘-‘)w=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){date=date*10+c-‘0‘;c=getchar();} return date*w; }
调用时,只需要:
int x; x=read();
即可。
效率超级高!
输出优化:
有读入优化,就有输出优化:
inline void write(int x){ if(x<0){putchar(‘-‘);x=-x;} if(x>9)write(x/10); putchar(x%10+‘0‘); }
调用时,只要:
int x=10; write(x);
即可。
时间大幅降低!
总结:
C++中还有各种各样的奇技淫巧,比如什么:
inline , register
等。
好好利用它们,可以卡掉那些TLE的点,甚至逆转AC!
以上是关于c++第二遍scanf读入问题的主要内容,如果未能解决你的问题,请参考以下文章