1

私はintの配列を持っています。[1,2,3,4,5] . 各行は 10 進数値に対応するため、5 は 1、4 は 10、3 は 100 であり、12345 の値を計算して保存します。これは機能です:

public long valueOf(int[]x) {

    int multiplier = 1;
    value = 0;
    for (int i=x.length-1; i >=0; i--) {
        value += x[i]*multiplier;
        multiplier *= 10;
    }
    return value;
}

ここで、valueOf() で値を計算する前に、他の int[] の値が長くないかどうかを確認したいと思います。確認方法は?table.length を使用するか、文字列に変換して送信する必要があります

public Long(String s) ?

それとも、 valueOf() 関数でスローする例外を追加するだけですか?

4

3 に答える 3

4

これが大きな整数を格納するための恐ろしい方法であることをご存知だと思います。BigIntegerを使用するだけです。

ただし、実際に値を超えているかどうかを確認する場合は、配列の長さが19以下であることを確認してください。次に、各セルをLong.MAX_VALUEの値と個別に比較できます。または、BigIntegerを使用することもできます。

于 2010-01-21T05:16:22.923 に答える
1

簡単な答え: すべての long は 18 桁に収まります。したがって、先行ゼロがないことがわかっている場合は、x.length<=18 を確認してください。先頭にゼロがある可能性がある場合は、配列をループしてその数を数え、それに応じて調整する必要があります。

これの欠点は、一部の 19 桁の数字が有効な long であるということです。つまり、9223372036854775807 よりも小さい数字です。したがって、本当に正確にしたい場合は、length>19 は悪いと言わなければなりません。 <19 が適切です。長さ ==19 の場合は、桁ごとに確認する必要があります。何をしようとしているかにもよりますが、実際に機能する数値のサブセットを拒否することは許容される場合があります。

他の人がほのめかしているように、より大きな問題は次のとおりです。なぜあなたはこれをしているのですか? これが、何らかの外部ソースから数字の文字列として数値を取得し、これを長くてクールな形式に変換する必要がある、ある種のデータ変換である場合。long に収まらない大きな数値を処理するクラスを作成しようとしている場合、その作業は非効率的で不必要です。10 進数を 1 桁以上 int にパックできるため、非効率的です。そうすることで、あらゆる種類のストレージとパフォーマンスが向上します。BigInteger はすでにこれを行っているため、不要です。なぜ BigInteger を使用しないのですか?

もちろん、宿題の問題なら話は別ですが。

于 2010-01-21T06:27:05.197 に答える
0

xのすべての値が非負になることが保証されていますか?

もしそうなら、あなたはこれを行うことができます:

public long valueOf(int[]x) {

    int multiplier = 1;
    long value = 0;  // Note that you need the type here, which you did not have
    for (int i=x.length-1; i >=0; i--) {
        next_val = x[i]*multiplier;
        if (Long.MAX_LONG - next_val < value) {
          // Error-handling code here, however you 
          // want to handle this case.
        } else {
          value += next_val
        }
        multiplier *= 10;  
    }
    return value;
}

もちろん、BigIntegerを使用すると、これがはるかに簡単になります。しかし、私はあなたの問題の仕様が何であるかわかりません。

于 2010-01-21T05:16:32.733 に答える