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)
这并没有找出a
、b
和c
是否都一样。 ==
的结果是 0
或 1
,然后将其与第三个数字进行比较。因此,对于每个示例,如果所有三个数字都是 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);
}
所以我有作业,但我无法理解为什么这段代码不起作用。
问题听起来像这样:
制作一个代码来检查 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)
这并没有找出a
、b
和c
是否都一样。 ==
的结果是 0
或 1
,然后将其与第三个数字进行比较。因此,对于每个示例,如果所有三个数字都是 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);
}