關於讀入優化問題 :
首先,讀入優化這裏是只是針對整數,getchar讀字符是非常快的,所以我們就用getchar了。(下面都假設輸入的數爲x)
負數處理
很簡單,用一個標誌變量f,開始時爲1,當讀入了’-’時,f變爲-1,最後x*=f即可
絕對值部分處理
顯然getchar每次只能讀一位,所以,每當讀了一位時x*=10,爲這一位“留位置”。
舉個例子:現在讀入了123,x爲123,再讀入了一個4,x*=10,變爲了1230,現在它的最後一位空出來了,正好留給4,x+=4,x就變爲了1234,當然,這裏的’4’是char類型,需要減去’0’纔是4,即:x=x*10+s-‘0’(s爲當前輸入的字符)
while(s<‘0’||s>‘9’)//不是數字字符
代碼
第一種寫法:
void read(int &x)//'&'表示引用,也就是說x是一個實參,在函數中改變了x的值就意味着在外面x的值也會被改變
{
int f=1;//標記正負
x=0;//歸零(這就是潛在bug,有可能傳進來時x沒有歸零)
char s=getchar();//讀入第一個字符
while(s<'0'||s>'9')//不是數字字符
{
if(s=='-')//不能直接把f=-1,有可能輸入的不是'-'而是其他亂七八糟的東西
f=-1;
s=getchar();//繼續讀
}
while(s>='0'&&s<='9')//是字符(一旦不是字符就意味着輸入結束了)
{
x=x*10+s-'0';
s=getchar();
}
x*=f;//改變正負
}
簡潔一些:
void read(int &x)
{
int f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
x*=f;
}
第二種寫法
inline int get(){
char ch;bool f = false;
while((ch == getchar())<'0' || ch >'9')
if(ch == '-') f = true;
int res = ch - 48;//48是‘0’字符的ASCLL編碼轉換數字0 需-48
while((ch == getchar()) >= '0' && ch <= '9')
res = res * 10 + ch -48;
return f ? ~res+1:res;//取反加+1!5值是0,~按位取反,5二進制00000101,取反11111010,代表-6
所以~5值-6,要想5 變-5 就的-6+1 =-5
}