web-dev-qa-db-ja.com

Java)の数値から数字を削除します

整数の最初の桁を削除するにはどうすればよいですか?

私の入力は整数です(たとえば、i = 123456789)。

次に、最初の桁を削除して、23456789と等しくなるようにします。

8
user3159331

これを試して

n = n % (int) Math.pow(10, (int) Math.log10(n));
14

これを行う1つの方法は次のとおりです。

  • Stringに変換します
  • 最初の「数字」のない部分文字列を取得します
  • intに変換します

コード:

public static void main(String[] args)
{
    int x = 123456789;

    String x_str = Integer.toString(x);

    int new_x = Integer.parseInt(x_str.substring(1));

    System.out.println(new_x);
}

出力:

23456789

注:これは1行で行うことができます

int x = 123456789;
int new_x = Integer.parseInt(Integer.toString(x).substring(1));

編集:

負の場合を処理するには、数値が正か整数かを確認します。

int new_x = Integer.parseInt(x > 0 ? 
    Integer.toString(x).substring(1) : Integer.toString(x).substring(2));
12
Christian

文字列変換を回避したい場合は、上位桁を見つけて減算することができます。

public static void main(String[] args) {
    int x = 123456789;
    System.out.println("x = " + x);
    int hi = x, n = 0;
    while (hi > 9) {
        hi /= 10;
        ++n;
    }
    for (int i = 0; i < n; i++) hi *= 10;
    x -= hi;
    System.out.println("x with high digit removed = " + x);
}
2
Gene

別のアプローチ:

int stripLeading(int i) {
  if(i > 0) {
    return i - (int)Math.pow(10, (int)Math.log10(i));
  } else if(i > 0) {
    return i + (int)Math.pow(10, (int)Math.log(-i+1));
  } else {
    return 0;
  }
}
1
Darren Gilroy

私はこれの文字列のないバージョンを覚えていると思います…私はそれをどのように行うかについて@Christianに完全に同意しますが…

注:@Darren Gilroyが指摘したように、負とゼロを社会的に考慮する必要があり、私の関数はそうしません。

もちろん %もより良い解決策です。

public static void main (String [] argv)
{
     final int x = 123456789;
     int newX = x;

     /* How many digits are there? */
     final double originalLog = Math.floor (Math.log10 (x));

     /* Let's subtract 10 to that power until the number is smaller */
     final int getRidOf = (int)Math.pow (10, originalLog);
     while (originalLog == Math.floor (Math.log10 (newX)))
     { newX -= getRidOf; }

     System.out.println (newX);
}

不十分なプロファイリングの試み:

printlnを使用せずに上記の関数をループすると、forループで20,000,000,000回繰り返されます。

real    0m9.943s
user    0m9.890s
sys     0m0.028s

クリスチャンのはるかに理解しやすく、完全に機能するバージョンと同じですが、2億回しか繰り返されません(私は怠惰で待つのに飽きたため):

real    0m18.581s
user    0m17.972s
sys     0m0.574s

したがって、Stringオブジェクトを作成すると、おそらく約200倍遅くなると主張する人もいるかもしれませんが、それは実際には微調整されたプロファイリング設定ではありません。

1
BRPocock

これが1行の純粋な数値ソリューションです。

i %= (int) Math.pow(10, (int) Math.log10(i));
1
Bohemian

Stringを使用せずに、より単純なメソッドを使用したい場合は、次のようにします。

  1. 整数の桁数を数えます。
  2. int10^nで割ります。 nは桁数です。
  3. 結果の絶対値を取得します。 //(-)veの数字の場合。

例えば

int i = 123456789;
int n = getDigitCount(i);
int r = Math.abs(i / (int)Math.pow(10,n)); //r stores result.

そして、あなたはこの方法を必要とするでしょう:

int getDigitCount(int num)
{
    int c = 0;
    while(num > 0){
        num/=10;
        c++;
    }
    return c;
}
0
Hungry Blue Dev