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

时间:2014-05-03 03:16:13

标签: c

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

#include <stdio.h>
#include <stdbool.h>

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但是我也遇到了同样的问题  任何人都可以解释为什么会发生这种情况

谢谢阿卡什

2 个答案:

答案 0 :(得分:5)

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

digit = n%10;

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

if (digit_seen[digit])
    break;

将数字中与数字对应的位置标记为真

digit_seen[digit] = true;

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

n /= 10;

在循环之后,如果n不等于0,则循环退出并找到一位数的倍数。

答案 1 :(得分:3)

基本上,模运算会为您提供单位所在位置的数字。当您进行除法并将其分配回行n中的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,模数会给你单位的位数来检查以前的值。