以下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但是我也遇到了同样的问题 任何人都可以解释为什么会发生这种情况
谢谢阿卡什
答案 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.结果如下:
因此,只要while循环运行,数字就会被除以10,模数会给你单位的位数来检查以前的值。