好的,所以我有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;
}
有人可以解释这些行中发生的事情吗?
我不明白程序是如何计算它是否是回文。
答案 0 :(得分:2)
基本上它计算一个通过反转原始数字的每个数字来计算的数字,如果最后两个数字相等则数字是回文数。
您应该尝试测试特定输入的代码,或者添加一些打印语句。
从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
,因此它不是回文。
答案 1 :(得分:1)
这基本上是反转数字,1234
变为4321
。它通过对基数10
执行算术运算来逐位进行。
num % 10
返回除法的余数10
。基本上我们正在从数字num
中读取最不重要的十进制数字。稍后num
除以10
,以便我们将其从最后一位数字中删除以继续迭代。
例如,在1234
中,操作返回4
并将其保存在变量digit
中,然后1234
受到影响,整数除以10变为{{ 1}}以便我们收集123
的下一次迭代。 (整数除法不会四舍五入。)重复此过程,直到此数字变为3
并且循环停止,因为它的条件为0
。
每次迭代都会累积while (num != 0)
到变量digit
,这次每次迭代都会rev
乘以rev
,这样我们就可以构建反向数字。
10
以rev
开头,乘以10仍为0
,加0
变为4
。下一次迭代以4
开始,乘以4
变为10
,加40
变为3
,依此类推,直到我们43
为止。
此时4321
为num
,循环停止。现在,计算机可以直接测试0
是否等于4321
,以确定它是否为回文数。
答案 2 :(得分:0)
它并不是很明显。基本上这个想法是'#pop; pop&#34;用户输入数字末尾的数字和&#34; push&#34;它们一次转换为反转数一位数。
它可能会帮助您查看带有注释的轻微重构版本:
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变为零。
user_input = 517
working_value = 0
last_digit = 5
然后我们对当前的反转值进行移位并添加最后一位数字。 (71 * 10) + 5 = 715
reversed = 715
现在我们的工作价值为零所以我们停止了。我们已经将数字715建立为517的反面。我们现在可以简单地比较这些数字,看看它们是不一样的。