出現的問題: 1.不是輸出數字而是返回數字 2.遇到正負號不break 3.字符‘0’-‘9’的對應的整型范圍是48-58 4.string類型的length是個函數而不是一個變量所以要用str.length() 5.最后輸出的時候可以和*10再加下一位 6.例如“ +0 123”也要返回0
自己的代碼(40ms):
#include "stdafx.h"#include<iostream>#include<string>#include<vector>#include<math.h>using namespace std;int main(){ string str; vector<int> jishu; cin >> str; int flag = 0, count = 0,sym = 0 ; int result = 0; for (int i = 0; i < str.length(); i++) { if (str[i] >= 48 && str[i] < 59) { //cout << int(a[i] - '0') << endl; /*if (sym == 1) { jishu.push_back(-int(str[i] - '0')); sym = 0; } else */ jishu.push_back(int(str[i] - '0')); flag = 1; } else if (str[i] == 45&&flag!=1) { if (sym != 0) break; sym = 1; flag = 1; } else if (str[i] == 43 && flag != 1) { if (sym != 0) break; sym = 2; flag = 1; } else if (str[i] == ' '&& flag != 1) { continue; } else { break; } } for (int i = 0; i < jishu.size(); i++) { /*if (jishu[i] < 0) { jishu[i] = -jishu[i]; result += jishu[i] * pow(10, count); result = -result; } else*/ result = count*10+jishu[i]; if (result / 10 != count) { if (sym == 1) return INT_MIN; else return INT_MAX; } count = result; } if (sym == 1) result = -result; cout << result; getchar(); return 0;}大牛寫的代碼分析:
int atoi(const char *str) { int sign = 1, base = 0, i = 0; //除去字符串前面的空格 while (str[i] == ' ') { i++; } //當遇到字符為'-'時,則sign為-1,否則為1 if (str[i] == '-' || str[i] == '+') { sign = 1 - 2 * (str[i++] == '-'); } //當符號后(或者無符號)遇到字符為數字的時候進行轉換 //若先遇到非符號或者非數字的情況的時候,則直接返回0 while (str[i] >= '0' && str[i] <= '9') { //1.若在加上最后一位之前的數大于了INT_MAX/10,則說明加上最后一位后一定會溢出,而atoi的函數功能是當遇到最大溢出 //的時候則輸出最大值就可以,所以直接根據符號進行return最大和最少值即可。 //2.若加上最后一位之前的數等于INT_MAX/10,則加上最后一位有可能不會溢出,則這時候需要進行判斷,由于int最大值為 //2147483647,則最后一位大于7則溢出,操作同上 if (base > INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) { if (sign == 1) return INT_MAX; else return INT_MIN; } base = 10 * base + (str[i++] - '0'); } return base * sign;}新聞熱點
疑難解答