这个C代码是如何工作的?

以下C代码在我的测试书中给出,它告诉我们输入的数字是否重复了一个数字

#include  #include  int main() { bool digit_seen[10] = {false}; int digit; long n; printf("Enter a number: "); scanf("%ld", &n); while (n > 0 ) { digit = n%10; if (digit_seen[digit]) break; digit_seen[digit] = true; n /= 10; } if (n>0) printf("Repeated digit\n"); else printf("No repeated dgit\n"); return 0; } 

问题是,我无法弄清楚这是如何工作的。 据我所知,它只是通过digit = n%10来计算余数而没有别的。

任何人都可以告诉我它是如何工作的

谢谢阿卡什

编辑:好的我编辑了这部分代码到以下

 if (n>0) printf("Repeated digit: %d\n", digit); else printf("No repeated dgit\n"); 

所以现在它也打印出正在重复的数字,但我得到了非常奇怪的问题。

如果我输入一个长于10个数字的数字,它会输出错误的输出,或打印出没有数字重复的数字。

我认为这可能是数组digit_seen [10] = {false}的问题所以我将它的长度增加到20但是我也遇到同样的问题可以解释为什么会发生这种情况

谢谢阿卡什

得到剩余的(n / 10)。 这是“一个人”的数字。

 digit = n%10; 

检查数组中与该数字对应的位置是否为真。 如果是这样,那就打破循环; 这个数字已被多次看到。

 if (digit_seen[digit]) break; 

将数字中对应于该数字的位置标记为true

 digit_seen[digit] = true; 

将“n”除以10,使“12345”变为“1234”。 当“n”只是一个数字时,这将变为“0”,这将满足循环条件。

 n /= 10; 

在循环之后,如果n不等于0,则早期退出循环并找到单个数字的倍数。

基本上,模运算会为您提供单位所在位置的数字。 当您进行除法并将其分配回n /= 10行中的n /= 10 ,您实际上是向左移动一个位置,从而为您提供要检查的原始数字的子字符串。

让我们举一个例子吧。 假设n = 12321.结果如下:

  • 迭代1:n%10 = 1,n / 10 = 1232
  • 迭代2:n%10 = 2,n / 10 = 123
  • 迭代3:n%10 = 3,n / 10 = 12
  • 迭代4:n%10 = 2,n / 10 = 1
  • 迭代5:n%10 = 1,n / 10 = 0

因此,只要while循环运行,数字就会被除以10,模数会给你单位的位数来检查以前的值。