前言
简介:涉及做题时关于输入输出有关问题。
输入数据
ACM中第一次遇到有多组输入的题目时,可能不了解如何确定是否输入结束,此处给出cin和scanf两个版本。
多组输入
使用cin
while(cin>>x){
}
使用scanf
while(scanf("%d",&x)!=EOF){
}
例题链接POJ 1001,该题下面的Hint(提示)中也提示了C/C++如何确定是否输入结束。(PS:此题不一定需要做,只是方便了解如何多组输入)
字符串输入
- 接受含有空格的字符串或以特定字符结束
此处用gets()有坑(ACM中直接使用会报错,故不推荐),可以根据情况使用getline()和cin.getline()。
//getline(istream,string,结束符); 结束符可选默认换行符
string s1;
getline(cin,s1); //需include<string>,且s需为string类型
getline(cin,s1,'c'); //以 'c' 为结束符
/*
istream & getline(char* buf, int bufSize, char delim);
cin.getline(字符指针(char*), 字符个数N(int),结束符(char)); 结束符可选默认换行符
PS:字符最后个为'\0',所以如果字符个数设置为5,输入 "abcde",输出结果为"abcd"
*/
char s2[10];
cin.getline(s2,10); //s2不可以为string类型,长度不超过10
cin.getline(s2,10,'c'); //以 'c' 为结束符,长度不超过10
快读快写
为了方便,输入阿鑫也经常用 cin。
但他其实是比较慢的,在一些输入数据很多的情况下,他的慢会体现的很明显。
所以对于多数据输入时,一般都用 scanf。
但是在个别情况下被卡时长且输入数据多的情况下,可以尝试使用快读(比如阿鑫之前做过道题限时5000ms,输入数据较多,scanf最后用时5000+ms,用快读后4600+就ac了)。
先直接上模板
快读
inline void read(int &x){
int sum = 0, flag = 1; char ch = getchar();
while(ch < '0' || ch > '9'){ if(ch == '-') flag = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') {sum = sum * 10 + ch - '0', ch = getchar();}
x = sum*flag;
}
/*
ps: 如果想再快一点的话
可将 while(ch >= '0' && ch <= '9') {sum = sum * 10 + ch - '0', ch = getchar();}
改为 while(ch >= '0' && ch <= '9') {sum=(sum<<3)+(sum<<1)+(ch^48); ch = getchar();}
*/
快写
void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
使用样例
#include <bits/stdc++.h>
using namespace std;
inline void read(int &x){
int sum = 0, flag = 1; char ch = getchar();
while(ch < '0' || ch > '9'){ if(ch == '-') flag = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') sum = sum * 10 + ch - '0', ch = getchar();
x = sum*flag;
}
void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
int main()
{
int a;
read(a); //cin>>a;
write(a); //cout<<a;
return 0;
}