C++问题:“嵌套”中的“中断”,循环不按预期工作?

C++问题:“嵌套”中的“中断”,循环不按预期工作?,c++,C++,我正在尝试编写一个程序,在以下条件下查找特定的4位数字: 所有四个数字都不同。 千位数字是十位数字的三倍。 这个数字是奇数。 数字之和是27。 我正在努力写这个程序。我尝试了嵌套for循环,迭代每个数字,直到满足中断终止循环的条件,如下所示: int a = 1; int b = 1; int c = 1; int d = 1; for (a = 1; a < 9; a++) { for (b = 1; b < 9; b++) { for (c = 1; c

我正在尝试编写一个程序,在以下条件下查找特定的4位数字:

所有四个数字都不同。 千位数字是十位数字的三倍。 这个数字是奇数。 数字之和是27。 我正在努力写这个程序。我尝试了嵌套for循环,迭代每个数字,直到满足中断终止循环的条件,如下所示:

int a = 1;
int b = 1;
int c = 1;
int d = 1;

for (a = 1; a < 9; a++) {
    for (b = 1; b < 9; b++) {
        for (c = 1; c < 9; c++) {
            for (d = 1; d < 9; d++) {

                if (a + b + c + d == 27 && a == 3 * c && a != b && a != c
                && a != d && b!= c && b != d && c != d && d % 2 != 0) {
                    break;
                }
            }
        }
    }
}

我希望数字a、b、c、d能为我提供满足上述if语句中所有条件的数字,从而中断。相反,abcd始终为9999。为什么会这样?我怎么会滥用break?

break只会从最内部的循环中中断。因此,当达到条件时,只需进入c值的下一次迭代。

break将只中断最内部的循环。因此,当达到条件时,只需进入c值的下一次迭代。

我建议将计算放入函数中,并在条件满足时退出函数,然后返回值

我建议的改进

在原始代码中,当必须测试0到9时,您只测试1到8之间的值。 对于a,只需测试3、6和9。 c可以从a派生,因此可以消除测试c值的for循环。 d循环中奇数的唯一循环。 切换b和d循环,使外循环中的代码运行更少的时间。 分隔if语句以便更易于阅读,并且可以在调试器中逐行遍历条件,并且可以指定在哪个条件下更容易产生错误。 a永远不会等于c,因此无需检查。 检查a和c在d循环内不等于d。 在添加数字并检查它们是否等于27之前,检查b是否不等于其他数字。
我建议将计算放入函数中,并在条件满足时退出函数,返回值

我建议的改进

在原始代码中,当必须测试0到9时,您只测试1到8之间的值。 对于a,只需测试3、6和9。 c可以从a派生,因此可以消除测试c值的for循环。 d循环中奇数的唯一循环。 切换b和d循环,使外循环中的代码运行更少的时间。 分隔if语句以便更易于阅读,并且可以在调试器中逐行遍历条件,并且可以指定在哪个条件下更容易产生错误。 a永远不会等于c,因此无需检查。 检查a和c在d循环内不等于d。 在添加数字并检查它们是否等于27之前,检查b是否不等于其他数字。
Break仅当您希望从所有循环中退出时才中断内部循环,您可以使用return或使用变量say标志

int a = 1;
int b = 1;
int c = 1;
int d = 1;
int flag=0;
for (a = 1; a < 9; a++) {
    for (b = 1; b < 9; b++) {
        for (c = 1; c < 9; c++) {
            for (d = 1; d < 9; d++) {

if (a + b + c + d == 27 && a == 3 * c && a != b && a != c
&& a != d && b!= c && b != d && c != d && d % 2 != 0) {
flag=1;
                    break;//breaks d loop
}
if(flag==1)
break;//breaks c loop
}
if(flag==1)
break;//breaks b loop
}
if(flag==1)
break;//breaks a loop
}


这是一种不好的做法,但会给出正确的输出。我更喜欢使用return语句,或者您可以使用goto语句跳出循环

如果您想跳出所有循环,请使用return或使用变量say标志

int a = 1;
int b = 1;
int c = 1;
int d = 1;
int flag=0;
for (a = 1; a < 9; a++) {
    for (b = 1; b < 9; b++) {
        for (c = 1; c < 9; c++) {
            for (d = 1; d < 9; d++) {

if (a + b + c + d == 27 && a == 3 * c && a != b && a != c
&& a != d && b!= c && b != d && c != d && d % 2 != 0) {
flag=1;
                    break;//breaks d loop
}
if(flag==1)
break;//breaks c loop
}
if(flag==1)
break;//breaks b loop
}
if(flag==1)
break;//breaks a loop
}

#include<stdio.h>

int findNum();

int main()
{
    int num;
    num = findNum();
    printf("%d is the required number.\n\n",num);
    return 0;
}

int findNum()
{
    int a, b, c, d;
    for (a = 1; a <= 9; a++)
    {
        for (b = 0; b <= 9; b++)
        {
            for (c = 0; c <= 9; c++)
            {
                for (d = 0; d <= 9; d++)
                {
                    if (a+b+c+d==27 && a==(3*c) && a!=b && a!=c && a!=d && b!=c && b!=d && c!=d && (d%2)!=0)
                    {
                        return (1000*a)+(100*b)+(10*c)+d;
                    }
                }
            }
        }
    }
}

这是一种不好的做法,但会给出正确的输出。我更喜欢使用return语句,或者您可以使用goto语句跳出循环

如果您的条件错误,您永远不会用4位数字生成数字。请为循环创建一个包含该数字的函数,并使用return而不是BREAK。我建议将if语句拆分为嵌套的if语句:IFCONDICTION1{IFCONDICTION2{ifcondition3{…}}}这样调试就更容易了。您只考虑了10个可能的数字中的8个。如果您的条件错误,您永远不会从4个数字中生成一个数字。请为循环创建一个包含该数字的函数,并使用return而不是break。我建议将if语句分解为嵌套的if语句:ifcondition1{ifcondition2{ifcondition3{…}}所以调试更容易。你只考虑了10个可能的数字中的8个。非常感谢。我将把它放在最外层的循环中。非常感谢。我将把它放在最外层的循环中。分开if语句以便更容易阅读。呃,这是非常主观的。还有,没有缩进…你甚至不得不放com你是对的,这是主观的,但是如果条件都在同一行,你就不能通过这些条件,这可能是我应该在答案中包括的……我通常把评论放在封闭的括号里,因为它们总是让我感到困惑。我想如果它们在修道院缩进的话,看起来会更困惑我的方式。如果你认为它不好,我会纠正它,因为你在这个网站上有资历。不,如果你认为你的方式更好,不要编辑它。即使我有更多虚构的互联网点,那也不一定说明我是对的。分开if语句,以便更容易阅读。啊,这是非常主观的。还有缺乏缩进…你甚至不得不对cl发表评论
#include<stdio.h>

int findNum();

int main()
{
    int num;
    num = findNum();
    printf("%d is the required number.\n\n",num);
    return 0;
}

int findNum()
{
    int a, b, c, d;
    for (a = 1; a <= 9; a++)
    {
        for (b = 0; b <= 9; b++)
        {
            for (c = 0; c <= 9; c++)
            {
                for (d = 0; d <= 9; d++)
                {
                    if (a+b+c+d==27 && a==(3*c) && a!=b && a!=c && a!=d && b!=c && b!=d && c!=d && (d%2)!=0)
                    {
                        return (1000*a)+(100*b)+(10*c)+d;
                    }
                }
            }
        }
    }
}

你是对的,这是主观的,但是如果所有的条件都在同一条线上,你就无法通过这些条件,这可能是我应该在答案中包括的东西。。。我通常把评论放在括号内,因为它们总是让我感到困惑。我认为如果按常规方式缩进,看起来会更混乱。如果你认为它不好,我会纠正它,因为你在这个网站上有资历。不,如果你认为你的方式更好,不要编辑它。即使我有更多想象中的互联网点,这也不一定说明我是对的。没有解释?没有解释?