问题描述
注意:我的英语不好,并且编辑被接受
我有一个函数,可以创建最大的数字,该数字可以从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整除。
数字是很大的,所以我认为最好将所有数字存储在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";