了解 int 反转逻辑

Understanding int reversing logic

本文关键字:int 了解      更新时间:2023-10-16

我是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。我无法理解。

它通过使用模数来谈论输入的最后一个字符。

输入为:12345

周期 1:

  1. new_num为 0,乘以 10 得到 0。
  2. 添加模数或您的输入12345 % 10 = 5,new_num现在是 5。
  3. 将您的输入除以 10 以删除最后一个数字。 input = 1234

周期 2、3、4 等:

  1. new_num是 5,乘以 10 得到 50。
  2. 加上模数或你的输入1234 % 10 = 4,new_num现在是 54。
  3. 将您的输入除以 10 以删除最后一个数字。 input = 123

我冒昧地修改了您的源代码,并以更易读的格式提供它

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(并添加inputNumber10除法的余数来保持覆盖reversedNumber
2(我们通过更改(减少(其小数位(除以10(来覆盖reversedNumber

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

首先看看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;
}

将数字视为堆叠在一起的数字。如果你把最上面的数字放在第二堆的上面,然后一直这样做,直到第一堆是空的,那么第二堆中的数字现在以相反的顺序堆叠。