Как удалить первую цифру целого числа?Удалить цифры из числа в Java
Мой ввод представляет собой целое число (например, i = 123456789).
Затем я хочу, чтобы удалить первую цифру, так что я равен 23456789.
Как удалить первую цифру целого числа?Удалить цифры из числа в Java
Мой ввод представляет собой целое число (например, i = 123456789).
Затем я хочу, чтобы удалить первую цифру, так что я равен 23456789.
Вот один из способов сделать это:
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
Примечание: Это может быть сделано в одной строке с
int x = 123456789;
int new_x = Integer.parseInt(Integer.toString(x).substring(1));
Edit:
Для обработки отрицательного случая, проверьте, если число положительное или целое число:
int new_x = Integer.parseInt(x > 0 ?
Integer.toString(x).substring(1) : Integer.toString(x).substring(2));
Привет, это решение не работает для отрицательных чисел :-). –
@FlorentBayle: Да, этот случай можно обрабатывать с помощью if-else. См. Править. – 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);
}
Невозможно использовать log10 здесь? Я бы предположил, что 'floor (log10 (x) + 1)' будет возвращать количество цифр, которое оно имеет, принимая x> 0. – Obicere
Конечно. В некоторых средах трансценденталы намного медленнее, чем целочисленная арифметика, и тянуть в математическую библиотеку, которая в противном случае была бы не нужна, поэтому я всегда думаю о целочисленном решении. – Gene
попробовать это
n = n % (int) Math.pow(10, (int) Math.log10(n));
Это аккуратное решение (+1). Вы также можете использовать '% ='. Кроме того, вам может не понадобиться первый '(int)' cast. – arshajii
Вот одна линия, чисто числовое решение:
i %= (int) Math.pow(10, (int) Math.log10(i));
Альтернативный подход:
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;
}
}
Я думаю, что я помню string- бесплатная версия этого ... althoug h Я полностью согласен с @Christian, как я бы это сделал ...
ПРИМЕЧАНИЕ: как заметил Дарден Гилрой, нужно учитывать негативы и ноль выборочно, и моя функция не может этого сделать.
Конечно, %
- лучшее решение.
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);
}
Плохо профилирование попытка:
Looping вышеуказанной функции без println
для 20000000000 повторов в for
цикли:
real 0m9.943s
user 0m9.890s
sys 0m0.028s
То же самое с христианином далеко проще для понимания и совершенно функциональная версия, но всего 200 000 000 повторов (потому что я ленив и устал ждать):
real 0m18.581s
user 0m17.972s
sys 0m0.574s
Таким образом, можно утверждать, что построение объектов String, вероятно, замедляет его примерно на 200 ×, но это не очень тонко настроенная настройка профилирования.
Если вы хотите идти более простые методы и без использования 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;
}
Также см [Return первой цифры целого] (http://stackoverflow.com/questions/ 2051817/return-first-digit-of-integer) – Reimeus