好的,我有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;
}
谁能解释一下这几行发生了什么?
我不明白程序是如何计算它是否是回文的
基本上它是通过反转原始数字的每个数字来计算一个数字,如果,最后,两个数字相等,那么这个数字是回文。
您应该尝试测试特定输入的代码,或者添加一些打印语句。
从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
,所以不是回文
这基本上是数字的颠倒,例如,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
,以确定它是否是回文数。
这不是很明显。从本质上讲,这个想法是从用户输入数字的末尾"弹出"数字,并将它们"推"到反转的数字上,每次一个数字。
它可以帮助你看到一个带有注释的稍微重构的版本:
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
用户输入号码,我们的工作值设为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
我们的工作值不是零,所以我们再次循环并获得工作值的最后一位并将其移除。因为只有一个数字,所以working_value变为0。
user_input = 517
working_value = 0
last_digit = 5
然后对当前的反转值进行移位,并加上最后一位数字。(71 * 10) + 5 = 715
reversed = 715
现在我们的工作值是零所以我们停止。我们把数字715作为517的倒数。现在我们可以简单地比较一下这两个数字,发现它们并不相同。