題目要求: 1. 字串為空或者全是空格,返回0; 2. 字串的前綴空格需要忽略掉; 3. 忽略掉前綴空格后,遇到的第一個(gè)字符,如果是‘+’或‘-’號(hào),繼續(xù)往后讀;如果是數(shù)字,則開始處理數(shù)字;如果不是前面的2種,返回0; 4. 處理數(shù)字的過程中,如果之后的字符非數(shù)字,就停止轉(zhuǎn)換,返回當(dāng)前值; 5. 在上述處理過程中,如果轉(zhuǎn)換出的值超出了int型的范圍,就返回int的最大值或最小值。 我一開始的代碼如下:
int len=str.size();if(len==0) return 0;int i;int sign=1;int ans=0;for(i=0;str[i]==' ';i++); //為了讓for循環(huán)不影響后面的,在此加上了分號(hào)if(str[i]=='+'){ sign=1; i++;}else if(str[i]=='-'){ sign=-1; i++;}while(i<len&&str[i]>='0'&&str[i]<='9'){ ans=ans*10+str[i++]-'0'; if(ans*sign>=INT_MAX) return INT_MAX; if(ans*sign<=INT_MIN) return INT_MIN;}return ans*sign;這樣做會(huì)報(bào)錯(cuò)。輸入是”2147483648”時(shí),輸出是“-2147483648”(正確結(jié)果是2147483647) 當(dāng)輸入為“2147483648”(INT_MAX+1),最后一次執(zhí)行ans=ans*10+str[i++]-‘0’之前ans=214748364,可是一執(zhí)行這一句話就產(chǎn)生了溢出。(后面那個(gè)自然也檢測(cè)不出來了) 對(duì)于int來說,2147483647+1=-2147483648,也就是214748364*10+8=-2147483648。 但是如果把a(bǔ)ns的定義從int改成long,就沒問題了。我也不知道是怎么回事。 查了下,sizeof(int)=sizeof(long)=4,sizeof(long long)=8;其能表示的最大數(shù)為2^31-1,最小的數(shù)是-2^31. 現(xiàn)在以8位的為例。(計(jì)算機(jī)中以補(bǔ)碼存儲(chǔ),所以下面都是補(bǔ)碼) 255 01111111 -256 10000000 -255 10000001 -1 11111111 0 00000000 所以就有 255+1=-256(溢出),-256-1=255(溢出) -1+1=0。 對(duì)于計(jì)算機(jī)來說,它在執(zhí)行加法計(jì)算的時(shí)候完全是按照補(bǔ)碼相加,而不用考慮正負(fù)號(hào),甚至都不用考慮溢出的問題。 回到正題,在認(rèn)識(shí)到上述問題后,我修改了while循環(huán)。
while(i<len&&str[i]>='0'&&str[i]<='9') { if(ans>INT_MAX/10||(ans==INT_MAX/10&&str[i]>'7')) return (sign==1)?INT_MAX:INT_MIN; ans=ans*10+str[i++]-'0'; }也就是在執(zhí)行ans=ans*10+str[i++]-‘0’之前就著手檢查,而不是在溢出之后才檢查,那樣就晚了。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注