我创建一个可整除为 30 的数字的函数在 C++ 中出错了

My function to create a number divisible to 30 broke in c++

注:本人英文不佳,欢迎编辑

我有一个函数可以根据用户在 c++ 中的输入创建可被 30 整除的最大数字。如果无法创建则 return -1 .

部分样本:

input :
2 // how many input numbers
3 0 // input
output:
30

input:
2
3 1
output :
-1

input:
11
4 9 6 0 6 9 4 9 0 6 3
output:
999666300

我的方法是检查数字是否可以被 3 和 10 整除,因为 gcd(3, 10) = 1 因此如果一个数字可以被 3 和 10 整除,它将被 30 整除。

我首先创建一个 string 类型的函数。

数字比较大,所以我觉得最好把所有的数字都存储在一个vector<int>中,然后从大到小排序,因为我需要创建最大的数字。

string create30div (vector<int> vecNum)
{
    sort(vecNum.begin(), vecNum.end(), greater<int>());
}

然后我首先检查数组是否有数字0,因为一个数字最后有一个0可以被10整除。我使用 find 函数来检查向量上是否有 0,如果没有则 return -1 immedialey.

string create30div (vector<int> vecNum)
{
    sort(vecNum.begin(), vecNum.end(), greater<int>());
    if (find(vecNum.begin(), vecNum.end(), 0) == vecNum.end())
    {
        return "-1";
    }
}

否则,如果向量有一个 0,那么我将所有数组的总数相加,首先检查总数是否可以被 0 整除,如果是,那么只需将向量的所有数字放入一个字符串和 return它。

string create30div (vector<int> vecNum)
{
    sort(vecNum.begin(), vecNum.end(), greater<int>());
    if (find(vecNum.begin(), vecNum.end(), 0) == vecNum.end())
    {
        return "-1";
    }
    else
    {
        if (accumulate(vecNum.begin(), vecNum.end(), 0) % 3 == 0)
        {
            goto sum;
        }
    }
sum:
    string sum {};
    for (auto i : vecNum)
    {
        sum += to_string(i);
    }
    return sum;

} 

注意:我知道在 c++ 中使用 goto 不好,但我真的不想把 sum 写得一团糟。你们有比我更好的解决方案吗?

回到问题,如果数字不能被3整除,有两种情况: 除以 3 有 1 的余数或 2 的余数

如果除以3有1的余数,我先倒序查了vector看有没有数除以3有1的余数,有则删掉这个数和 return 总和

string create30div (vector<int> vecNum)
{
    sort(vecNum.begin(), vecNum.end(), greater<int>());
    if (find(vecNum.begin(), vecNum.end(), 0) == vecNum.end())
    {
        return "-1";
    }
    else
    {
        if (accumulate(vecNum.begin(), vecNum.end(), 0) % 3 == 0)
        {
            goto sum;
        }
        else if (accumulate(vecNum.begin(), vecNum.end(), 0) % 3 == 1)
        {
            bool isNumMod1Exist{false};
            for (int i = 0; i < vecNum.size(); i++)
            {
                if (vecNum.at(vecNum.size() - i - 1) % 3 == 1)
                {
                    vecNum.erase(vecNum.end() - i);
                    isNumMod1Exist = true;
                    break;
                }
            }
            if (isNumMod1Exist)
            {
                goto sum;
            }
     }
sum:
    string sum {};
    for (auto i : vecNum)
    {
        sum += to_string(i);
    }
    return sum;

} 

如果没有,我再检查是否有两个除以3的数有2的余数,如果有则全部删除,如果没有则return -1.

string create30div (vector<int> vecNum)
{
    sort(vecNum.begin(), vecNum.end(), greater<int>());
    if (find(vecNum.begin(), vecNum.end(), 0) == vecNum.end())
    {
        return "-1";
    }
    else
    {
        if (accumulate(vecNum.begin(), vecNum.end(), 0) % 3 == 0)
        {
            goto sum;
        }
        else if (accumulate(vecNum.begin(), vecNum.end(), 0) % 3 == 1)
        {
            bool isNumMod1Exist{false};
            for (int i = 0; i < vecNum.size(); i++)
            {
                if (vecNum.at(vecNum.size() - i - 1) % 3 == 1)
                {
                    vecNum.erase(vecNum.end() - i);
                    isNumMod1Exist = true;
                    break;
                }
            }
            if (isNumMod1Exist)
            {
                goto sum;
            }
            else
            {
                int counter{0};
                for (int i = 0; i < vecNum.size(); i++)
                {
                    if (vecNum.at(vecNum.size() - i - 1) % 3 == 2)
                    {
                        vecNum.erase(vecNum.end() - i);
                        counter++;
                        i--;
                        if (counter >= 2)
                            break;
                    }
                }
                if (counter >= 2)
                {
                    goto sum;
                }
                else
                {
                    return "-1";
                }

            }
        }
sum:
    string sum {};
    for (auto i : vecNum)
    {
        sum += to_string(i);
    }
    return sum;

}

如果整数除以 3 的余数为 2,则相同。

string create30div (vector<int> vecNum)
{
    sort(vecNum.begin(), vecNum.end(), greater<int>());
    if (find(vecNum.begin(), vecNum.end(), 0) == vecNum.end())
    {
        return "-1";
    }
    else
    {
        if (accumulate(vecNum.begin(), vecNum.end(), 0) % 3 == 0)
        {
            goto sum;
        }
        else if (accumulate(vecNum.begin(), vecNum.end(), 0) % 3 == 1)
        {
            bool isNumMod1Exist{false};
            for (int i = 0; i < vecNum.size(); i++)
            {
                if (vecNum.at(vecNum.size() - i - 1) % 3 == 1)
                {
                    vecNum.erase(vecNum.end() - i);
                    isNumMod1Exist = true;
                    break;
                }
            }
            if (isNumMod1Exist)
            {
                goto sum;
            }
            else
            {
                int counter{0};
                for (int i = 0; i < vecNum.size(); i++)
                {
                    if (vecNum.at(vecNum.size() - i - 1) % 3 == 2)
                    {
                        vecNum.erase(vecNum.end() - i);
                        counter++;
                        i--;
                        if (counter >= 2)
                            break;
                    }
                }
                if (counter >= 2)
                {
                    goto sum;
                }
                else
                {
                    return "-1";
                }

            }
        }
        else
        {
            bool isNumMod2Exist{false};
            for (int i = 0; i < vecNum.size(); i++)
            {
                if (vecNum.at(vecNum.size() - i - 1) % 3 == 2)
                {
                        vecNum.erase(vecNum.end() - i);
                        isNumMod2Exist = true;
                        break;
                }
            }
            if (isNumMod2Exist)
            {
                goto sum;
            }
            else
            {
                int counter{0};
                for (int i = 0; i < vecNum.size(); i++)
                {
                    if (vecNum.at(vecNum.size() - i - 1) % 3 == 1)
                    {
                        vecNum.erase(vecNum.end() - i);
                        counter++;
                        i--;
                        break;
                    }
                }
                if (counter >= 2)
                {
                    goto sum;
                }
                else
                {
                    return "-1";
                }

            }



        }

    }
sum:
    string sum {};
    for (auto i : vecNum)
    {
        sum += to_string(i);
    }
    return sum;

}

和驱动代码。

int main()
{
    int n;
    cin >> n;
    vector<int> vecNum;
    for (int i = 1; i <= n; i++)
    {
        int inputVec;
        cin >> inputVec;
        vecNum.push_back(inputVec);
    }
    cout << create30div(vecNum);
}

但是我有一个问题,这个程序产生了意想不到的结果。例如:

input:
11
4 9 6 0 6 9 4 9 0 6 3
It outputs:
-1

为什么?

p/s:我知道这个 post 比它应该的长得多,但我只是想让你知道我在做这个程序时在想什么。

完整代码:

#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
#include <string>

using namespace std;

string create30div (vector<int> vecNum)
{
    sort(vecNum.begin(), vecNum.end(), greater<int>());
    if (find(vecNum.begin(), vecNum.end(), 0) == vecNum.end())
    {
        return "-1";
    }
    else
    {
        if (accumulate(vecNum.begin(), vecNum.end(), 0) % 3 == 0)
        {
            goto sum;
        }
        else if (accumulate(vecNum.begin(), vecNum.end(), 0) % 3 == 1)
        {
            bool isNumMod1Exist{false};
            for (int i = 0; i < vecNum.size(); i++)
            {
                if (vecNum.at(vecNum.size() - i - 1) % 3 == 1)
                {
                    vecNum.erase(vecNum.end() - i);
                    isNumMod1Exist = true;
                    break;
                }
            }
            if (isNumMod1Exist)
            {
                goto sum;
            }
            else
            {
                int counter{0};
                for (int i = 0; i < vecNum.size(); i++)
                {
                    if (vecNum.at(vecNum.size() - i - 1) % 3 == 2)
                    {
                        vecNum.erase(vecNum.end() - i);
                        counter++;
                        i--;
                        if (counter >= 2)
                            break;
                    }
                }
                if (counter >= 2)
                {
                    goto sum;
                }
                else
                {
                    return "-1";
                }

            }
        }
        else
        {
            bool isNumMod2Exist{false};
            for (int i = 0; i < vecNum.size(); i++)
            {
                if (vecNum.at(vecNum.size() - i - 1) % 3 == 2)
                {
                        vecNum.erase(vecNum.end() - i);
                        isNumMod2Exist = true;
                        break;
                }
            }
            if (isNumMod2Exist)
            {
                goto sum;
            }
            else
            {
                int counter{0};
                for (int i = 0; i < vecNum.size(); i++)
                {
                    if (vecNum.at(vecNum.size() - i - 1) % 3 == 1)
                    {
                        vecNum.erase(vecNum.end() - i);
                        counter++;
                        i--;
                        break;
                    }
                }
                if (counter >= 2)
                {
                    goto sum;
                }
                else
                {
                    return "-1";
                }

            }



        }

    }
sum:
    string sum {};
    for (auto i : vecNum)
    {
        sum += to_string(i);
    }
    return sum;

}



int main()
{
    int n;
    cin >> n;
    vector<int> vecNum;
    for (int i = 1; i <= n; i++)
    {
        int inputVec;
        cin >> inputVec;
        vecNum.push_back(inputVec);
    }
    cout << create30div(vecNum);
}


 

你在几个地方有 off-by-one 错误: vecNum.erase(vecNum.end() - i); 应该 vecNum.erase(vecNum.end() - i - 1);

另一个错误(在 2 个地方):counter 永远不会达到 2,因为你 break; 第一次递增。第一次你可以这样修复错误:

            int counter{0};

            for (int i = 0; i < vecNum.size(); i++)
            {
                if (vecNum.at(vecNum.size() - i - 1) % 3 == 2)
                {
                    vecNum.erase(vecNum.end() - i - 1);
                    counter++;
                    i--;
                    if (counter >= 2)
                        goto sum;
                }
            }

            return "-1";