C语言4位可能的变体有异常

C languange 4 digit possible variations with exception

所以我有作业,但我无法理解为什么这段代码不起作用。

问题听起来像这样:

制作一个代码来检查 4 位数字的所有可能变体,但一个数字中没有 3 个相同的数字。 (我希望这是有道理的)

我的代码:

#include<stdio.h>


int main ()
{
        int i;
        char a,b,c,d;

        for (i=0; i<9999; i++)
        {
                a = i/1000;
                b = i/100%10;
                c = i/10%10;
                d = i%10;

                if (a==b==c)    {i++;}
                else if (b==c==d)       {i++;}
                else if (c==d==a)       {i++;}
                else if (d==a==b)       {i++;}
                else if (a==b==c==d)    {i++;}

                else
                {
                        printf("%d,%d,%d,%d\n", a,b,c,d);
                }
        }
}

我想让它打印出这样的东西:

0,0,1,1
0,0,1,2
0,0,1,3
...
0,1,0,9
0,1,1,0
0,1,1,2
...
9,9,8,8

而是打印:

0,1,2,2
0,1,3,3
0,1,4,4
0,1,5,5
0,1,6,6
...
0,8,6,6
0,8,7,7
0,8,8,8
0,8,9,9
0,9,2,2
...
9,9,9,8

你不能像这样使用多个等式。您必须在条件和条件下分别执行它们(例如 a==b && b==c)。

这些比较有问题:

 if (a==b==c)

这并没有找出abc是否都一样。 == 的结果是 01,然后将其与第三个数字进行比较。因此,对于每个示例,如果所有三个数字都是 9,则 9==9==9 将变为 1==9,即 0,因此不会采用 if。更重要的是,你对 9==9==1.

之类的东西有误报

你在这里需要的是

if ((a==b) && (a==c))

现在你检查 a 是否等于 b,如果等于,你用 c 检查它,如果 if都一样。

当然对于其他比较也是如此,所以你想要 else if ((a==b) && (a==c) && (a==d))

而不是 else if (a==b==c==d)

正如其他答案所指出的,您无法在 C 语言中链接比较运算符并获得预期的结果。使用逻辑运算符来组合比较。使用 || 来避免所有 else 语句可能会更清楚。

发布的代码还有另一个重要问题:只要发现失败的数字,i 就会递增。但随后 i 又被 for 循环递增。这会导致跳过失败号码之后的号码,因此将找不到一些所需的号码。例如,3222 应该失败,随后的数字 3223 应该通过,但是发布的代码跳过了这个数字(在比较更正之后),下一个要检查的数字 3224.相反,只需使用 continue:

if ((a == b && a == c) ||
    (b == c && b == d) ||
    (c == d && c == a) ||
    (d == a && d == b) ||
    (a == b && a == c && a == d)) {
    continue;
} else {
    printf("%d,%d,%d,%d\n", a,b,c,d);
}