我创建数字可除以30的函数在c ++

问题描述

注意:我的英语不好,并且编辑被接受

我有一个函数,可以创建最大的数字,该数字可以从c ++中的用户输入中除以30。如果无法创建,则返回-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,如果没有,则立即返回-1。

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

否则,如果向量的值为0,那么我将所有数组的总数相加,然后首先检查总数是否可以被0整除,如果是,则将向量的所有数字都放入字符串中并返回它。

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

} 

注意:我知道在c ++中使用goto不好,但是我真的不想写遍及整个agian的sum。你们有比我更好的解决方案吗?

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

如果除以3的余数为1,我首先以相反的顺序检查vector,看是否存在除以3的余数为1的数字,如果是,则删除该数字并返回总和

string create30div (vector<int> vecNum)
{
    sort(vecNum.begin(),0) % 3 == 0)
        {
            goto sum;
        }
        else if (accumulate(vecNum.begin(),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,如果是,则将其全部删除,如果没有,则返回-1。

string create30div (vector<int> vecNum)
{
    sort(vecNum.begin(),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(),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:我知道这篇文章的长度要长得多,但是我只想让您知道我在执行此程序时的想法。

完整代码

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

using namespace std;

string create30div (vector<int> vecNum)
{
    sort(vecNum.begin(),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);
}


 

解决方法

您在多个地方出现一个错误: 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";