了解int逆转逻辑

时间:2014-09-26 14:53:15

标签: c++ reverse palindrome

我是C ++的新手 所以我在互联网上找到了这个反向代码。我的教授。告诉我做一个回文检查,所以我先找反面 这是我做的

void main() 
{
    int num;
    int new_num = 0;
    int dummy;

    cout << "Masukkan angka";
    cin >> num;

    dummy = num;
    cout << dummy << endl;

    while (num > 0)
    {
        new_num = new_num*10 + (num % 10);
        num = num/10;
    }
    cout << new_num << endl;

    if ( new_num == dummy)
    {
        cout << "true";
    }
    else 
        cout<<"false";

    getch();
}

最令人困惑的部分是这个

while(num > 0)
{
    new_num = new_num*10 + (num % 10);
    num = num/10;
}
cout << new_num << endl;

我在互联网上发现了这个,但我不知道它是如何工作的。 有人可以解释这段代码如何反转我输入的数字吗?就像我输入12345时一样,输出为54321.我无法理解。

3 个答案:

答案 0 :(得分:0)

通过使用modulo来讨论输入的最后一个字符。

输入是: 12345

周期1:

  1. new_num为0,乘以10给出0。
  2. 添加模数或输入12345 % 10 = 5,new_num现在为5。
  3. 将输入除以10以删除最后一位数字。 input = 1234
  4. 循环2,3,4等:

    1. new_num为5,乘以10得50。
    2. 添加模数或输入1234 % 10 = 4,new_num现在为54。
    3. 将输入除以10以删除最后一位数字。 input = 123

答案 1 :(得分:0)

我冒昧地修改你的来源,并以更易读的格式提供它

int inputNumber = 123;
int reversedNumber = 0;

cout << "The input number is " << inputNumber << endl;

while (inputNumber > 0) {
    reversedNumber = reversedNumber*10 + inputNumber%10;
    inputNumber = inputNumber/10;
}
cout << "The reversed number is " << reversedNumber << endl;

首先,始终使用有意义的变量。
阅读代码时会更有帮助。

现在解释
模运算符给出除法的余数(不是商!), 即5%2 = 1.

在while循环中,
1)我们通过改变(增加)小数位(乘以10)并添加reversedNumber和{{1}的除法的余数来继续写inputNumber。 } 2)我们通过改变(递减)其小数位置(除以10)来覆盖10

我鼓励您实际在纸上追踪程序,或打印变量的值(调试?)以查看此操作的工作原理。

答案 2 :(得分:-1)

首先看看num % 10做了什么:

#include <iostream>

int main() {
  for (int i = 0; i < 100; ++i) {
    std::cout << i << " % 10 = " << i % 10 << '\n';
  }
}

http://coliru.stacked-crooked.com/a/8d26b893682b0001

你看到了这种模式吗?这个表达式基本上只是从一个数字中得到最不重要的十进制数字。

你应该知道new_num*10中的模式,甚至没有看,因为我们在小学数学中学到了这一点:它将数字移到左边的一个地方。

然后,如果您考虑在这种情况下将添加什么new_num*10 + num % 10,您应该看到在[0..9]范围内添加一个数字到最低位数为零的整数,只会用新数字替换零。

num/10向右移动数字,因为它使用积分除法,所以小数部分被丢弃。

所以我们共同拥有:

int remove_last_digit(int value) { return value / 10; }

int get_last_digit(int value) { return value % 10; }

int push_digit(int value, int digit) {
  return value * 10 + digit;
}

bool has_more_digits(int value) { return value != 0; }

int reverse_int(int value) {
  int reversed_value = 0;
  while ( has_more_digits(value)) {
    reversed_value = push_digit(reversed_value, get_last_digit(value));
    value = remove_last_digit(value);
  }
  return reversed_value;
}

将数字视为彼此堆叠的数字。如果你取最高位并将它放在第二堆的顶部,并继续这样做,直到第一堆是空的,那么第二堆中的数字现在以相反的顺序堆叠。