|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
可以看懂用for的代码,但是当时做题我用了while循环,显示是死循环,但是不知道错在哪里,麻烦大佬们帮我看看这道题如何用while循环谢谢!
int main()
{
int a=1, b=1, c=1, d=1;
int n=0;
while (0<a<40)
{
a++;
while (0 < b < 40)
{
b++;
while (0 < c < 40)
{
c++;
while (0 < d < 40)
{
d++;
if (a + b + c + d == 40 && a * 10 + b * 5 + c * 2 + d * 1 == 100)
{
n++;
}
}
}
}
}
printf("%d\n",n);
return 0;
}
你的代码确实存在一个死循环的问题,问题出在你的while循环条件中。在你的代码中,你设定了条件"0<a<40",在C语言中,这样的条件是无效的。这是因为在C语言中,比较运算符是两两进行的,不能进行这样的链式比较。你应该将这个条件分开写,即"a > 0 && a < 40"。然而,在这种情况下,由于你的a,b,c,d初始值都为1,且在每个while循环的开始都会自增,所以这个判断条件总是成立的,这就造成了死循环。
另外,在这个问题中,我们需要找出所有面值10元、5元、2元和1元的组合,使得总值等于100元,这意味着a,b,c,d可能的取值范围应该是0到100,而不是1到40。
修复这个问题后的代码可能如下所示:
- #include<stdio.h>
- int main() {
- int a=0, b=0, c=0, d=0;
- int n=0;
- while (a <= 100)
- {
- b = 0;
- while (b <= 100)
- {
- c = 0;
- while (c <= 100)
- {
- d = 0;
- while (d <= 100)
- {
- if (a * 10 + b * 5 + c * 2 + d * 1 == 100)
- {
- n++;
- }
- d++;
- }
- c++;
- }
- b++;
- }
- a++;
- }
- printf("%d\n",n);
- return 0;
- }
复制代码
这个代码的运行时间可能会比较长,因为我们需要检查每一个可能的组合,这样的复杂度是O(n^4)。你可以通过一些优化来降低运行时间,例如,我们知道10元、5元、2元和1元的最大数量分别为10, 20, 50, 100,可以根据这个信息来限制循环的范围,从而减少运行时间。
|
|