2010-11-12 2 views
3

Как нам обратить число с ведущими нулями в число? Например: если вход 004, выход должен быть 400.Обратный номер с ведущими нулями

Я написал ниже программу, но работает только в том случае, если во входных данных нет начальных нулей.

int num; 
cout<<"Enter number "<<endl; 
cin>>num; 

int rev = 0; 
int reminder; 
while(num != 0) 
{ 
    reminder = num % 10; 
    rev = rev * 10 + reminder; 
    num = num/10; 
} 
cout<<"Reverse = "<<rev<<endl; 

Есть ли способ ввода числа с ведущими нулями? Даже тогда выше логика не работает для таких чисел.

Любое простое решение? Это выполнимо, принимая ввод как строку и обрабатывая ее. Но это не выглядит красиво.

* EDIT: Если длина номера известна, то можно изменить число с нулевыми значениями. (Без использования строки) *

Я выложу код, как только он будет работать.

EDIT 2: Я попытался вернуть символы в поток cin, а затем прочитать и вычислить обратное. Он работает для двухзначных номеров.

Но если длина известна, ее гораздо легче найти обратную. Все, что мне нужно сделать, умножить на 10 за необходимое количество раз. Так что я думаю, я бы пошел со струнным подходом. Надеюсь, что интервьюер будет счастлив :)

+9

Если вам нужны ведущие нули на входе, вам в значительной степени нужно ввести его в виде строки. – ChrisF

+1

Не выглядит красиво ?! А? :) Это самый простой способ - вам даже не нужно гадать с фактическим числом, как вы делаете выше. Единственная проблема с строковым подходом, по-видимому, заключается в проверке того, что ввод фактически представляет собой число, но это не совсем сложно. В чем проблема? –

ответ

6

Ведущие нули не представлены двоичными числами (int, double и т. Д.). Таким образом, вам, вероятно, придется использовать std::string. Прочитайте ввод в строке, затем вызовите std::reverse(), передавая строку в качестве входных данных.

+1

Реализация 'std :: reverse()' была, вероятно, * реальным * вопросом. –

+0

Тогда вопрос (как вопрос интервью) является неопределенным. Либо правильным решением является использование функций STL (показывая, что вы не собираетесь изобретать колесо), либо откатываете свои собственные (показывая, что вы знаете, как это делается), но собеседник не узнает, какие ожидается. –

6

Да, вы должны использовать строку. Вы не можете хранить ведущие нули в int.

+0

Нет, он также может использовать другие типы, кроме строки. И на какой вопрос именно вы отвечаете «да»? –

+0

К его предположению, что он должен использовать строку. Какой тип вы бы предложили? – AndreKR

+0

Всегда зависит от конкретных обстоятельств, но, например, любой последовательный контейнер может быть выполнен для работы, например. 'std :: deque ', 'std :: list ', 'class Digit09 {...}; std :: stack ; '. И я не считаю, что он должен использовать строку. Возможно редактирование, которое я не вижу? –

1

Прочитайте номер в строковом формате (т. Е. Используйте std :: string) и измените строку.

0

Как сказал ChrisF, вам нужно загрузить строку, потому что 4 и 004 - это тот же int, и вы не можете отличить его после того, как вы назначили его переменной int.

Следующее, что нужно сделать, это обрезать строку, содержащую только цифры (если вы хотите быть правильными) и запустить на ней - и все готово.

+0

Остерегайтесь некоторых допущений, это 008 и 8 одинаковое число? –

+1

@ D.Shawley: мы здесь не говорим, но вводим числа, используя 'std :: istream :: operator >>'. –

1

После преобразования вашего ввода в целое число, которое вы выполняете в строке 3, вся информация о ведущих нулях на входе пользователя теряется.

Вам понадобится использовать строку.

2

Если вам известна общая ширина, которую вы хотите, чтобы номер был предварительно, вы можете повторно использовать код, который у вас есть, и сохранить результаты (справа налево) в нулевом инициализированном массиве. Примечание. Вероятно, вы захотите добавить некоторую проверку ошибок в код, указанный ниже.

int num, width; 

cout<<"Enter number "<<endl; 
cin>>num; 

cout<<"Enter width: "<<endl; 
cin>>width; 

int rev[width]; 
for (int i = 0; i < width; ++i) 
    rev[i] = 0; 

int cnt = width - 1; 
int rev = 0; 
int reminder; 
while(num != 0) 
{ 
    reminder = num % 10; 
// rev = rev * 10 + reminder; 
    rev[cnt] = remainder; 
    --cnt; 
    num = num/10; 
} 

cout << "Reverse: "; 
for (int i = 0; i < width; ++i) 
    cout << rev[i]; 
cout << endl; 

Это позволит вам легко манипулировать цифрами и в будущем.

+0

int rev [width] = {0}; не компилируется в C++ 03 – bjskishore123

+0

Извините, я должен был проверить - это должно просто инициализировать все элементы массива до 0. Я отредактировал свой ответ, чтобы исправить это. – Nick

+0

Хорошо, спасибо за ваши усилия. – bjskishore123

0

Сохраните номер в виде строки и используйте std::reverse.

std::string num; 
std::cout << "Enter number " << std::endl; 
std::cin >> num; 

std::string rev(num); 
std::reverse(rev.begin(), rev.end()); 

std::cout << "Reverse = " << rev << std::endl; 
0

Замените while петлю с for петлей с одинаковым числом серий, как вы хотите оригинальный номер имеет цифры (в том числе ведущих нулей). например 004 потребует, чтобы цикл был запущен 3 раза и не прерывался преждевременно после x == 0.

1

Рекурсивный подход, но легко преобразуется в петлю ...

#include <iostream> 

int f(int value = 1) 
{ 
    char c; 
    return (std::cin.get(c) && isdigit(c)) 
      ? (c - '0') * value + f(10 * value) 
      : 0; 
} 


int main() 
{ 
    std::cout << f() << '\n'; 
} 
0
s = int(raw_input(" enter the no of tyms :")) 
n = 0 
list, list1 = [], [] 

while n <= s: 
    m = raw_input("enter the number:") 
     n=n+1 
     list.append(m) 

print list 
list.reverse() 
print list 

Reverse в одном из лучших языки Python.