最近快讀在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