2016-11-04 4 views
-4

Итак, у меня есть код на C++, где программа должна проверить, является ли введенный номер палиндром.Код C++: непонятно

код:

#include <iostream> 
using namespace std; 

int main() 
{ 
    int n, num, digit, rev = 0; 

    cout << "Enter a positive number: "; 
    cin >> num; 

    n = num; 

    do 
    { 
     digit = num % 10; 
     rev = (rev * 10) + digit; 
     num = num/10; 
    } while (num != 0); 

    if (n == rev) 
     cout << " The number is a palindrome"; 
    else 
     cout << " The number is not a palindrome"; 

    return 0; 
} 

, но у меня есть проблема. Я не понимаю эту часть:

do 
{ 
    digit = num % 10; 
    rev = (rev * 10) + digit; 
    num = num/10; 
} 

Может кто-нибудь объяснить, что происходит в этих строках?

Я не понимаю, как программа рассчитала, является ли это палиндром или нет.

+1

_ «кто-то объяснил бы, что происходит в этих действиях?» _ Немного математики. –

+0

Это просто строит обратное 'num' в' rev'. – ForceBru

+2

Какую часть этого кода вы не понимаете? Вы знаете, что такое операторы и как они работают? Если это так, вы можете сделать шаги на карандаше и бумаге, чтобы посмотреть, как они работают, или выполнить код с вашим отладчиком и посмотреть, что происходит. – NathanOliver

ответ

2

В основном он вычисляет число, которое вычисляется путем изменения каждой цифры исходного числа, если в конце оба числа равны, а число - палиндром.

Вы должны попробовать протестировать код для определенного ввода или добавить некоторые операторы печати.

Старт с num = 234

// iteration 1 
digit = num % 10 = 234 % 10 = 4; // remainder of division 
rev = (0 * 10) + 4 = 4; 
num = num/10 = 23; // integer division is truncated 
// iteration 2 
digit = num % 10 = 23 % 10 = 3; 
rev = (4 * 10) + 3 = 43; 
num = num/10 = 2; 
// iteration 3 
digit = num % 10 = 2 % 10 = 2; 
rev = (43 * 10) + 2 = 432; // you can see that 432 is the reverse of 234 in literal sense 
num = num/10 = 0; 

так 432 != 234, следовательно, это не палиндром.

+0

Я наконец понял, спасибо за помощь –

1

Это, в основном, инвертирует число, 1234 становится 4321, например. Он делает цифру цифрой, выполняя арифметические операции с базой 10.

num % 10 возвращает остальную часть дивизии 10. В основном мы читаем младшую значащую десятичную цифру с номера num. Позже num делится на 10 так, чтобы мы разделили его с последней цифры, чтобы продолжить итерацию.

Так 1234, например, операция возвращает 4 и сохраняет его в переменной digit, а затем 1234 страдает и целочисленное деление на 10, чтобы стать 123 так, что следующей итерации мы собираем 3. (Целочисленные деления не округлены.) Процесс повторяется до тех пор, пока это число не станет 0, и остановка циклов, поскольку это условие - while (num != 0).

Каждая итерация будет накапливаться digit переменной rev, на этот раз умножая rev на 10 каждую итерацию, так что мы строим обратный номер.

rev начинается как 0, что умноженные на 10 по-прежнему 0, плюс 4 становится 4. Следующая итерация начинается с 4, умноженная на 10 становится 40, плюс 3 становится 43 и т. Д. До тех пор, пока у нас есть 4321.

На данный момент num является 0 и петля останавливается. Теперь компьютер может напрямую протестировать, если 4321 равен 1234, чтобы определить, является ли это палиндром.

0

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

Это может помочь вам увидеть немного рефакторинга версию с комментариями:

int input = 0;   // The user input. Does not change after it's been entered. 
int reversed = 0;  // The reversed user input, gradually built one number at a time. 

int working_value = 0; // Starts off as the user input and numbers are 
         // gradually removed from the end 


// Get the user input   
cout << "Enter a positive number: "; 
cin >> input; 

working_value = input; 

do 
{ 
    //Get the last digit of the working value 
    int last_digit = working_value % 10; 
    //Remove the last digit from the working value 
    working_value = working_value/10; 

    // "Shift" the reversed digits, and add the last digit of the 
    // working value 
    reversed = (reversed * 10) + last_digit; 

} while (working_value != 0); 

// ... identical from here 

Он также может быть полезно пройти через полный пример. Мы будем использовать значение .

пользователь вводит номер и наше рабочее значение установлено на 517.

user_input = 517 
working_value = 517 
reversed  = 0 

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

user_input = 517 
working_value = 51 
last_digit = 7 

Затем мы выполняем наш сдвиг на нашем текущем обратном значении и добавляем последнюю цифру. (0 * 10) + 7 = 7

reversed  = 7 

Наше рабочее значение не равно нулю, поэтому мы снова идти вокруг петли и получить последнюю цифру рабочего значения и удалить его:

user_input = 517 
working_value = 5 
last_digit = 1 

Затем мы выполняем свою смену на наш ток обратной значение и добавьте эту последнюю цифру. (7 * 10) + 1 = 71

reversed  = 71 

Наше рабочее значение не равно нулю, так мы идем вокруг петли снова и получить последнюю цифру рабочего значения и удалить его. Была только одна цифра, поэтому значение work_value становится равным нулю.

user_input = 517 
working_value = 0 
last_digit = 5 

Затем мы выполняем наш сдвиг на нашем текущем обратном значении и добавляем последнюю цифру. (71 * 10) + 5 = 715

reversed  = 715 

Теперь наше рабочее значение равно нулю поэтому мы останавливаемся. Мы построили номер 715 как обратный 517. Теперь мы можем просто сравнить числа и увидеть, что они не совпадают.

Смежные вопросы