了解 int 反转逻辑
Understanding int reversing logic
我是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:
- new_num为 0,乘以 10 得到 0。
- 添加模数或您的输入
12345 % 10 = 5
,new_num现在是 5。 - 将您的输入除以 10 以删除最后一个数字。
input = 1234
周期 2、3、4 等:
- new_num是 5,乘以 10 得到 50。
- 加上模数或你的输入
1234 % 10 = 4
,new_num现在是 54。 - 将您的输入除以 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(并添加inputNumber
和10
除法的余数来保持覆盖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;
}
将数字视为堆叠在一起的数字。如果你把最上面的数字放在第二堆的上面,然后一直这样做,直到第一堆是空的,那么第二堆中的数字现在以相反的顺序堆叠。
- 为什么在全局范围内使用"extern int a"似乎不行?
- 正在尝试了解输入验证循环
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- C++我需要了解在哪里使用指针和双指针
- 了解字符 * 到 int * 的转换及其含义
- 了解C++代码 - "Get the number of digits in an int"
- 了解 int 反转逻辑
- 了解如何将char[0]转换为int
- 了解使用"new int[]"的目的