Как поставить все нули в целое число справа без внешнего хранилища - PullRequest
3 голосов
/ 05 мая 2011

Как мы можем сдвинуть все нули в целое число вправо.

Например, int x = 560106, после сдвига x = 561600.

Мы не можем использовать другую переменную иМанипулирование строками не является хорошим ответом.

Кроме того, я знаю грязный метод рекурсивного использования мода в зависимости от целочисленной длины.

1 Ответ

1 голос
/ 06 мая 2011

Я не уверен, что это ваше решение, но рекурсивная реализация есть (извините за использование Схемы - я балуюсь ею, поэтому я пытаюсь использовать ее на практике):

(define (bubble-digit-up number digit)
  (if (= number 0)
      digit
    (let ((last-digit (modulo number 10)))
      (if (= last-digit 0)
          (* (bubble-digit-up (/ number 10) digit) 10)
        (+ (* number 10) digit)))))

(define (shift-zeros-right x)
  (if (<= x 0)
      0
    (let* ((last-digit (modulo x 10))
           (rest (shift-zeros-right (/ (- x last-digit) 10))))
      (bubble-digit-up rest last-digit))))

Функцияbubble-digit-up получает два параметра: число и цифру.Перемещает цифру рядом с первой ненулевой цифрой.Например, (bubble-digit-up 100 4) вернет 1400.shift-zeros-right - это основная функция, которая рекурсивно решает проблему: извлекает первую цифру, сдвигает нули оставшейся части вправо и помещает извлеченную цифру в нужное место.битовые операции (в соответствии с тегом), но это лучшее, что у меня есть.


РЕДАКТИРОВАТЬ: Если вы рассматриваете использование let как мошенничество, здесь переменная безверсия:

(define (bubble-digit-up number digit)
  (if (= number 0)
      digit
    (if (= (modulo number 10) 0)
        (* (bubble-digit-up (/ number 10) digit) 10)
      (+ (* number 10) digit))))

(define (shift-zeros x)
  (if (<= x 0)
      0
    (bubble-digit-up 
     (shift-zeros (/ (- x (modulo x 10)) 10))
     (modulo x 10))))

РЕДАКТИРОВАТЬ 2: реализация Python может быть проще следовать:

def bubble_digit_up(num, digit):
    if num == 0:
        return digit
    else:
        if num%10 == 0:
            return 10*bubble_digit_up(num/10, digit)
        else:
            return 10*num + digit

def shift_zeros_right(x):
    if x <= 0:
        return 0
    else:
        return bubble_digit_up(shift_zeros_right(x/10), x%10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...