關於讀入數據優化的寫法小結

關於讀入優化問題
首先,讀入優化這裏是只是針對整數,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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章