題目:
給定乙個字串str,如果str符合日常書寫的整數形式,並且屬於32位整數的範圍,返回str所代表的整數值,否則返回0.
舉例:
str="123",返回123;
str="023",因為"023"不符合日常的書寫習慣,返回0;
str="a13",返回0;
str="0",返回0;
str="2147483647",返回2147483647;
str="2147483648",因為溢位,返回0;
str="-123",返回-123。
難度:★
思路:
該題分兩步,一判斷書寫形式是否符合日常規範,若符合,進行下一步;若不符合,則直接退出。二將證書字串轉成整數值,並且判斷是否溢位。
注意:在c++語言中,int型別的邊界值是根據儲存位數決定的,因此需要利用公式或者現成的函式取得int型別的最小值(負數)。
首先,對於書寫規範的判斷,一定要考慮全面。
情形1,使用者什麼都沒有輸入,可通過字串的長度為0判別,返回false;
因為可能有"-"字元的存在,需要單獨對首字元進行判斷。
情形2,首字元為"-"且長度為1,說明字串就是"-",不符合書寫要求,返回false;
情形3,首字元為"-",長度大於1,且第二字元為0,說明字串形如"-0%",不符合書寫要求,返回false(%為任意長度的字串);
情形4,首字元為"0",且長度大於1,說明字串形如"0%",不符合書寫要求,返回false;
情形5,從下標1開始遍歷整個字串,只要出現非數字字元,返回false;
情形6,以上5種情形均不符合,則說明字串符合書寫要求,返回true。
其次,對整數字串進行轉換,遍歷期間,需要注意對於數值是否超過最小值或最大值的判斷。
一般,int型別整數的最小值為-2147483648,最大值為2147483647。可以看出,最小值的最大值比最大值的絕對值大1,因此轉換過程中的絕對值一律以負數形式出現,然後根據flag最後決定返回什麼。
對於遍歷的初始下標,根據flag決定是0還是1。遍歷過程中num是否溢位的判斷,假設當前字元為ch,則'0'-ch是當前字元所代表的數字的負數形式。若num加上'0'-ch前發現num小於minq,則num加上"0"-ch一定溢位;或者若num加上"0"-ch前發現num等於minq,且當前字元"0"-ch小於minr,則num加上"0"-ch一定溢位。
以上都是對於負數形式的數字進行判斷,而對於正整數,其最大值比最小值的絕對值小1,因此遍歷結束後判斷flag==0且num==min,則說明溢位。
最後,根據flag判斷正負數,並輸出正確的數字。
**:
#include #include #define min -int(pow(2,8*sizeof(int)))
#define minq -pow(2,8*sizeof(int))/10
#define minr -int(pow(2,8*sizeof(int)))%10
using namespace std;
bool isvalid(string str,int len)
return true;
}int main()
if (!isvalid(str, len))
int val = 0, num = 0, i, flag = 0;
if (str[0] == '-')
flag = 1;
for (i = (flag ? 1 : 0); i < len; i++)
num = num * 10 - (str[i] - '0');
} if (flag == 0 && num == min)
cout << (flag ? num : -num) << endl;
system("pause");
return 0;
}
將整數字串轉成整數值
給定乙個字串s,如果字串符合日常書寫的整數形式,並且屬於32位整數的範圍,返回str所代表的整數值,否則返回0.比如 s 123 則返回123.s 0123 則返回0.s 123 則返回 123.s 0 返回0.s 返回0.s 123a4 返回0.首先,需要判斷字串中是否有非法字元,具體 如下 pu...
將整數字串轉成整數值
題目 給定乙個字串str,如果str符合日常書寫的整數形式,並且屬於32位整數的範圍,返回所代表的整數值,否則返回0。eg str 123 返回123.str 023 因為 023 不符合日常的書寫習慣,所以返回0.str a23 返回0 str 0 返回0 str 2147483647 返回214...
將整數字串轉成整數值
題目 給定乙個字串str,如果str符合日常書寫的整數形式,並且屬於32位整數的範圍,返回所代表的整數值,否則返回0。eg str 123 返回123.str 023 因為 023 不符合日常的書寫習慣,所以返回0.str a23 返回0 str 0 返回0 str 2147483647 返回214...