整数の最初の桁を削除するにはどうすればよいですか?
私の入力は整数です(たとえば、i = 123456789)。
次に、最初の桁を削除して、23456789と等しくなるようにします。
これを試して
n = n % (int) Math.pow(10, (int) Math.log10(n));
これを行う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));
文字列変換を回避したい場合は、上位桁を見つけて減算することができます。
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);
}
別のアプローチ:
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;
}
}
私はこれの文字列のないバージョンを覚えていると思います…私はそれをどのように行うかについて@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行の純粋な数値ソリューションです。
i %= (int) Math.pow(10, (int) Math.log10(i));
String
を使用せずに、より単純なメソッドを使用したい場合は、次のようにします。
int
を10^n
で割ります。 n
は桁数です。例えば
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;
}