最近快读在CSDN比较多滚啦喂 ,我也来蹭一波热度
先看代码:
inline int read()
{
int s = 0, w = 1;//s表示那个数的绝对值,w是符号
char ch = getchar();//因为getchar比scanf这些都快,所以用getchar
while (ch < '0' || ch > '9')//如果不是数字
{
if (ch == '-')//如果是负号
{
w = -1;//设置符号为负
}
ch = getchar();//下一个
}//现在已经没有非数字字符了,下面的ch就都是数字了
while (ch >= '0' && ch <= '9')
{
s = (s << 1) + (s << 3) + ch - 48;//把每一位往上加并使用位运算提速
ch = getchar();//下一个
}
return s * w;//全部读取完毕,返回这个数
}
呃,这个模板可以原封不动的套到long long
那么char和char*还有string也很明显了
所以可以写出来一个大集合:
class Scanner
{
private:
bool blank(char c);
public:
int readInt();
long long readLL();
char readChar();
void readCStr(char *c);
string readString();
}
int Scanner::readInt()
{
int s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
{
w = -1;
}
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
s = (s << 1) + (s << 3) + ch - '0';
ch = getchar();
}
return s * w;
}
long long readLL()
{
long long s = 0;
int w = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
{
w = -1;
}
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
s = (s << 1) + (s << 3) + ch - '0';
ch = getchar();
}
return s * w;
}
char Scanner::readChar()
{
return getchar();
}
void Scanner::readCStr(char *c)
{
char ch = getchar();
while (blank(ch)) ch = getchar();
int p = 0;
for (c[p++] = ch; !blank(ch = getchar()); c[p++] = ch);
c[p] = '\0';//结尾
}
string Scanner::readString()
{
char strBuf[10000];
readCStr(strBuf);
string s = strBuf;
return s;
}
bool Scanner::blank(char c)
{
return c == ' ' || c == '\r' || c == '\n' || c == '\t';
}//愉快的结束啦
你们可以试着重载一下Scanner