我是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.我无法理解。
答案 0 :(得分:0)
通过使用modulo来讨论输入的最后一个字符。
输入是: 12345
周期1:
12345 % 10 = 5
,new_num现在为5。input = 1234
循环2,3,4等:
1234 % 10 = 4
,new_num现在为54。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;
}
将数字视为彼此堆叠的数字。如果你取最高位并将它放在第二堆的顶部,并继续这样做,直到第一堆是空的,那么第二堆中的数字现在以相反的顺序堆叠。