c++代码:不懂

  • 本文关键字:不懂 代码 c++ 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;
 }

谁能解释一下这几行发生了什么?

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

基本上它是通过反转原始数字的每个数字来计算一个数字,如果,最后,两个数字相等,那么这个数字是回文。

您应该尝试测试特定输入的代码,或者添加一些打印语句。

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,这样我们就得到了相反的数字。

rev0开始,乘以10仍然是0,加上4成为4。下一次迭代从4开始,乘以10成为40,再加上3成为43,以此类推,直到我们得到4321

此时num0,循环停止。计算机现在可以直接测试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的倒数。现在我们可以简单地比较一下这两个数字,发现它们并不相同。

最新更新