我创建一个可整除为 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";
注:本人英文不佳,欢迎编辑
我有一个函数可以根据用户在 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";