最終試験は終わりました
整数へのNum 8文字列(atoi関数)
タイトル自体は難しいことではありません。間違ったポイントを理解するいくつかの簡単な
- --32が不正である(一方のみに署名)
- 32合法的な(あなたは+を追加することができます)
- word123は(長いデジタル符号動作しません空でない最初のかどうかなどのような)合法ではありません
私は間違いサンプルを作った:2147483648
INT_MAXのためにstrがあればときだけアイデアがANSで、INT_MAXが/ 10は、アカウントに等号を取って、実際には、オーバーフロー率を避けるために見始めて、8または9はINT_MIN、STR9オーバーフローのため、オーバーフローします
最後は、最初に+ 1を開始するので、 - 、我々は+判断できない注意を払うにnumpdを書きました。そして端部が+1に沿ったものであるため、最終的なSTR [END]は=エンド-1を終了する必要の最初の非遵守、この時点で、真の実効値へ戻ります
クラス解決{ パブリック: ブール numpd(文字列 strの、INT NUM) { 場合(STR [NUM]> = ' 0 ' && STR [NUM] <= ' 9 ' ) を返す 真。 リターン はfalse ; } int型 changeone(文字列 strの、INTまず、INT 端) { int型のlen =エンド最初; 長い ANS = 0 ; 以下のために(INT iが+第= 1 ; I <= END; I ++ ) { // のprintf( "1")。 もし(STR [第] == ' - ' ) { // COUT << ABS(ANS)<<」「<< INT_MIN / 10 << ENDL。 もし(ABS(ANS)> INT_MAX / 10 ||(ABS(ANS)== INT_MAX / 10 && STR [I] == ' 9 ' )) のリターン; INT_MIN ANS = ANS * 10 + ' 0 ' - STR [I]; printf( "ほら"); } 他 { // COUT << ANS << ENDL。 もし(ANS> INT_MAX / 10 ||(ANS == INT_MAX / 10 && STR [I]> = ' 8 ' )) を返すINT_MAXと、 ANS = ANS * 10 + STR [I] - ' 0 ' 。 } } 戻りANSを、 } int型 changesecond(文字列 strの、INTまず、INT 端) { INT LEN =エンド第一+ 1 。 長い ANS = 0 ; 用(INT ; I <=エンドI ++ iは最初= ) { // COUT << "この" << ANS << ENDL。 もし(ANS> INT_MAX / 10 ||(ANS == INT_MAX / 10 && STR [I]> = ' 8 ' )) を返すINT_MAXと、 ANS = ANS * 10 + STR [I] - ' 0 ' 。 } // 場合(ANS <= INT_MIN)戻りINT_MIN。 ANS; INT myAtoi(文字列strの){ int型第= 0 。 int型エンド= 0 ; INT LEN = str.length()。 一方、(最初の<LEN && STR [第] == ' ' ) 第 ++ 。 もし(最初の最初のlen == ||(numpd(STR)== falseを![最初] && STR = ' + '![最初] && STR = ' - ' )) を返す 0 ; // printfの( "ほら"); 端= +最初の1。//避免负号 一方(端<LEN && numpd(STR、終了)) エンド ++ 。 エンド =エンド1 。 もし(端<第&&(STR [第] == ' - ' || STR [第] == ' + ' )) 戻り 0 ; もし(STR [最初]を== ' - ' || STR [第] == ' + ' ) 戻りchangeone(STR、まず、エンド)。 他の リターンchangesecond(STR、まず、エンド)。 } }。