2

JavaでAtoi関数を書いています。+ve 整数に対しては正常に動作します。しかし、私が欲しいのは、負の整数を入力するとエラーが発生するはずです。そこで、クラス Atoi に continue ステートメントを含めてみました。実装されているクラスは次のとおりです。

class Atoi {

    int atoi(String tmp) {

    int result = 0;

        for (int i = 0; i < tmp.length(); i++) {

            char digit = (char)(tmp.charAt(i) - '0');

        if(digit == '-')

        continue;
        }

        else {

            result += (digit * Math.pow(10, (tmp.length() - i - 1)));
        }

    return result;

    }
}   

しかし残念なことに、それは文字の負の等価物を私に与えます。つまり、-12 の場合は 655312 になります! ヘルプ。

編集:浮動小数点数をチェックする必要があるとします。どうすればよいですか? 12.1 または 123.2 を入力すると、それぞれ 12.1 と 123.2 が返されます!!

4

6 に答える 6

2

代わりにcontinue、エラーを与える必要があります(例外をスローするreturn -1か、「エラーを与える」で何を意味するか)。

を無視したい場合は-、else 句を次のように変更できます。

result = digit + result * 10;
于 2012-11-06T13:36:29.373 に答える
1

もちろん、このようなコードを書くこともできますが、tmpが有効な数値であることを確認する必要があります。

int atoi(String tmp) {

    int result = 0;

    int factor = tmp.charAt(0) == "-" ? -1 : 1;

        for (int i = 0; i < tmp.length(); i++) {

            if (tmp.chatAt(i) < '0' ||  tmp.chatAt(i) > '9') 

                continue;

                char digit = (char)(tmp.charAt(i) - '0');

                result += (digit * Math.pow(10, (tmp.length() - i - 1)));
        }

        return result * factor;
}
于 2012-11-06T13:51:04.637 に答える
1

これがプログラミングの演習として実行されていない場合は、より簡単な解決策があります。

  static int atoi(String tmp)
  {
      int result = Integer.parseInt(tmp);
      if(result >= 0) {
         return result;
      } else {
         throw new IllegalArgumentException("Negative string "+"\"" + tmp + "\"");
      }
  }

否定的な結果の場合は、適切な例外またはその他のアクションに置き換えてください。投稿されたコードのように「-」を無視したい場合は、if-then-else を次のように置き換えます。

      return Math.abs(result);

このコードは、"abc" などの文字列に対しても例外をスローします。

より一般的に言えば、ライブラリ メソッドが意図したとおりに動作しない場合、その動作を変更するメソッドで使用する方が、書き直すよりも簡単な場合がよくあります。

于 2012-11-06T14:02:27.617 に答える
1

明らかな問題のクイックフィックス: ロジックの順序が間違っていた...

それ以外の

    char digit = (char)(tmp.charAt(i) - '0');
    if(digit=='-')
    continue;

試す

    char origChar=tmp.charAt(i);
    if(origChar=='-')
        continue;
    char digit = (char)(origChar - '0');

しかし、さらに 2 つの問題があります。

  • 「-」文字が存在する場合、値を否定しません!
  • これが入力文字列の場合: -1-2-3-4-5? 結果は面白いでしょう!編集:この入力も試してください: 'répa'... さらに興味深い結果が得られました!

間違った入力でもテストすることを忘れないでください。@Klaus が示唆したように、間違った入力が関数に与えられた場合は、正しいエラー メッセージで例外 (できればIllegalArgumentException ) をスローすることを躊躇しないでください...

于 2012-11-06T13:34:53.737 に答える
0

負の数を変換したくない場合は-、さらにループするのではなく、符号に遭遇するたびに 0 を返します。このコードを if-else ブロックの前に置きます。

     if(tmp.charAt(i)=='-')  
         return 0;
于 2012-11-06T13:35:22.460 に答える
0
if(digit=='-')

(char)(tmp.charAt(i)

あなたのコードは - がないことを前提としています

(char)(tmp.charAt(i) - '0');

「桁」変数を数値に盲目的にクランプする最適化です。

コードが実際に行っていることをステップ実行し、ASCII チャートを検索して、'0' の減算 ('0' == 48) を処理する必要があるため、'1' (49) - '0' (48) ) = 1 など...

于 2012-11-06T13:38:36.917 に答える