2014-01-04 7 views
7

Как удалить первую цифру целого числа?Удалить цифры из числа в Java

Мой ввод представляет собой целое число (например, i = 123456789).

Затем я хочу, чтобы удалить первую цифру, так что я равен 23456789.

+0

Также см [Return первой цифры целого] (http://stackoverflow.com/questions/ 2051817/return-first-digit-of-integer) – Reimeus

ответ

10

Вот один из способов сделать это:

  • Преобразовать его 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)); 
+0

Привет, это решение не работает для отрицательных чисел :-). –

+0

@FlorentBayle: Да, этот случай можно обрабатывать с помощью if-else. См. Править. – Christian

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); 
} 
+0

Невозможно использовать log10 здесь? Я бы предположил, что 'floor (log10 (x) + 1)' будет возвращать количество цифр, которое оно имеет, принимая x> 0. – Obicere

+0

Конечно. В некоторых средах трансценденталы намного медленнее, чем целочисленная арифметика, и тянуть в математическую библиотеку, которая в противном случае была бы не нужна, поэтому я всегда думаю о целочисленном решении. – Gene

10

попробовать это

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

Это аккуратное решение (+1). Вы также можете использовать '% ='. Кроме того, вам может не понадобиться первый '(int)' cast. – arshajii

1

Вот одна линия, чисто числовое решение:

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

Альтернативный подход:

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; 
    } 
} 
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 ×, но это не очень тонко настроенная настройка профилирования.

0

Если вы хотите идти более простые методы и без использования String, то вот мое простое взятие:

  1. Подсчета количества цифр Int целого числа.
  2. Разделите int на 10^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; 
} 
Смежные вопросы