C ++代码:不明白

时间:2016-11-04 17:27:37

标签: c++

好的,所以我有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;
 }

有人可以解释这些行中发生的事情吗?

我不明白程序是如何计算它是否是回文。

3 个答案:

答案 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,这样我们就可以构建反向数字。

10rev开头,乘以10仍为0,加0变为4。下一次迭代以4开始,乘以4变为10,加40变为3,依此类推,直到我们43为止。

此时4321num,循环停止。现在,计算机可以直接测试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的反面。我们现在可以简单地比较这些数字,看看它们是不一样的。