2

我正在做一个简单的程序,我接受电话号码的前四位数字,并且必须为其余数字生成所有可能性。最后 6 位加起来必须等于 33。如果第四位为奇数,则第五位必须为偶数,如果第四位为偶数,则第五位必须为奇数。

我已经确定它没有将数字相加,函数 plotNumbers() 中的 for 循环实际上并没有循环。我完全迷路了。有人有想法么?

#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;

void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4);
bool findTrueFalse(vector<int> vec);

int _tmain(int argc, _TCHAR* argv[])
{
int digit1, digit2, digit3, digit4;
vector<int> number;

cout << "Enter the first four digits:\n";
cin >> digit1;
cin >> digit2;
cin >> digit3;
cin >> digit4;

if (digit4 == 0 || digit4 == 2 || digit4 == 4 || digit4 == 6 || digit4 == 8)
{
    number.push_back(1);        
    plotNumbers(number, digit1, digit2, digit3, digit4);
}
else if (digit4 == 1 || digit4 == 3 || digit4 == 5 || digit4 == 7 || digit4 == 9)
{
    number.push_back(0);
    plotNumbers(number, digit1, digit2, digit3, digit4);
}
else
{
    cout << "\nYou entered an illegal value.  Good-bye.\n\n";
}

system("pause");
return 0;
}

void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4)
{

for ( ; number1[0] < 10; number1[0] += 2)
{
    number1.push_back(0);


    for ( ; number1[1] < 10; ++number1[1])
    {
        number1.push_back(0);


        for ( ; number1[2] < 10; ++number1[2])
        {
            number1.push_back(0);


            for ( ; number1[3] < 10; ++number1[3])
            {
                number1.push_back(0);


                for ( ; number1[4] < 10; ++number1[4])
                {
                    number1.push_back(0);


                    for ( ; number1[5] < 10; ++number1[5])
                    {

                        bool total33 = findTrueFalse(number1);

                        if (total33)
                        {
                            cout << "(" << digit1 << digit2 << digit3 << ") ";
                            cout << digit4 << number1[0] << number1[1] << " - ";
                            cout << number1[2] << number1[3] << number1[4] << number1[5] << endl;
                        }
                    }
                }
            }
        }
    }
}
}

bool findTrueFalse(vector<int> vec)
{
int total = 0;
vector<int>::iterator postIt;

for (postIt = vec.begin(); postIt != vec.end(); ++postIt)
{
    total += *postIt;
}

if (total == 33)
{
    return true;
}
else
{
    return false;
}

}
4

2 回答 2

1

您如何准确检查它们是否在循环?因为在我的程序中它们是,但我认为您不了解它们实际上是如何工作的(无意冒犯)。

考虑这个片段:

int i = 0;
int j = 0;

for (; i < 10; i += 1) { //OUTER for
    cout << "i == " << i << endl;

    for (; i < 10; j += 1;) { //INNER for
        cout << "j == " << j << endl;
    }
//THIS POINT
}

该程序将进入 OUTER 循环,打印出“i == 0”,然后进入 INNER 循环,打印 10 行“j == ...”。现在在此点 j == 10,因此当代码为“i”执行另一个循环并检查 INNER 的条件时,它看到 j == 10,因此 10 不低于 10,因此它跳过了 INNER。

这正是您的程序中正在发生的事情。当您退出带有这样指定的控制变量的 INNER 循环时,如果您想在下一轮 OUTER 循环中进入 INNER 循环,则必须记住将其值更改为通过条件的值。

我已经改变了你的代码来做到这一点,看起来它工作正常。您需要做的就是在代码中的 INNER 循环之后添加 4 行代码,以将其控制变量归零。

编辑:另外,请考虑 Eabs 的回答,因为您的矢量维护很差。

于 2013-06-08T08:48:15.940 回答
1

首先,尽量使用短代码来避免错误,例如:

if (digit4 % 2 == 0)

代替

if (digit4 == 0 || digit4 == 2 || digit4 == 4 || digit4 == 6 || digit4 == 8)

其次,你只需要做number1.pushback(0)一次,但你要这样做好几次。你知道跑步时会发生什么number1.pushback(0)吗?我猜不是:

  • 0它会在向量末尾添加一个值为 的新元素number1

我建议使用以下代码(您进行缩进):

#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;

void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4);
bool findTrueFalse(vector<int> vec);

int _tmain(int argc, _TCHAR* argv[])
{
int digit1, digit2, digit3, digit4;
vector<int> number;

cout << "Enter the first four digits:\n";
cin >> digit1;
cin >> digit2;
cin >> digit3;
cin >> digit4;

if (digit4 % 2 == 0)
{
    number.push_back(1);        
    for (int i=0; i<5; i++)
        number.push_back(0);
    plotNumbers(number, digit1, digit2, digit3, digit4);
}
else if (digit4 % 2 == 1)
{
    number.push_back(0);
    for (int i=0; i<5; i++)
        number.push_back(0);
    plotNumbers(number, digit1, digit2, digit3, digit4);
}
else
{
    cout << "\nYou entered an illegal value.  Good-bye.\n\n";
}

system("pause");
return 0;
}

void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4)
{

for ( ; number1[0] < 10; number1[0] += 2)
{
    number1[1] = 0;


    for ( ; number1[1] < 10; ++number1[1])
    {
        number1[2] = 0;


        for ( ; number1[2] < 10; ++number1[2])
        {
            number1[3] = 0;


            for ( ; number1[3] < 10; ++number1[3])
            {
                number1[4] = 0;


                for ( ; number1[4] < 10; ++number1[4])
                {
                    number1[5] = 0;


                    for ( ; number1[5] < 10; ++number1[5])
                    {

                        bool total33 = findTrueFalse(number1);

                        if (total33)
                        {
                            cout << "(" << digit1 << digit2 << digit3 << ") ";
                            cout << digit4 << number1[0] << number1[1] << " - ";
                            cout << number1[2] << number1[3] << number1[4] << number1[5] << endl;
                        }
                    }
                }
            }
        }
    }
}
}

bool findTrueFalse(vector<int> vec)
{
int total = 0;
vector<int>::iterator postIt;

for (postIt = vec.begin(); postIt != vec.end(); ++postIt)
{
    total += *postIt;
}

if (total == 33)
{
    return true;
}
else
{
    return false;
}

}
于 2013-06-08T08:41:07.360 回答