从表示为向量的数字中减一?
Decremeting one from a number represent as a vector?
我正在尝试将一个可以无限长并用向量表示的数字减 1。举一个小例子:
vector<int> v1 = {5, 0, 0, 0};
末尾减一后的结果应该是:
vector<int> v1 = {4, 9, 9, 9};
这是我当前的代码:
int size = v1.size();
bool carry = false;
for (int i = size - 1; i > 0; i--) {
if (v1.at(i) == 0) {
v1.at(i) = 9;
if (v1.at(0) == 1) {
v1.at(0) = 0;
}
carry = true;
} else {
v1.at(i) -= 1;
carry = false;
}
}
if (carry == true && v1.at(0) == 0) {
v1.erase(v1.begin());
} else if (carry == true) {
v1.at(0) -= 1;
}
return v1;
当我测试它时,一切正常,除了像 11119 这样的数字。结果是 00019。有什么我可以调整的吗?
我觉得你没有把逻辑想清楚。
这是需要发生的事情。
如果最后一个数是0,需要改成9,并且要保留一个进位。
重复直到不需要保持进位。
该逻辑最好使用 do - while
循环来实现。这是我想出的。
int size = v.size();
bool carry = true;
int i = size - 1;
do
{
if (v.at(i) == 0)
{
v.at(i) = 9;
}
else
{
v.at(i)--;
carry = false;
}
--i;
}
while ( carry == true && i >= 0);
这是一个完整的程序
#include <iostream>
#include <vector>
void test(std::vector<int> v)
{
int size = v.size();
bool carry = true;
int i = size - 1;
do
{
if (v.at(i) == 0)
{
v.at(i) = 9;
}
else
{
v.at(i)--;
carry = false;
}
--i;
}
while ( carry == true && i >= 0);
for ( auto item : v )
{
std::cout << item << " ";
}
std::cout << std::endl;
}
int main()
{
test({1, 1, 1, 1, 9});
test({5, 0, 0, 0, 0});
}
及其输出
1 1 1 1 8
4 9 9 9 9
查看它在 https://ideone.com/lxs1vz 的工作情况。
您尝试做的减法可以这样完成:
#include <iterator>
std::vector<int> v1 = {5, 0, 0, 0};
for (std::vector<int>::reverse_iterator i = v1.rbegin(); i != v1.rend(); i++) {
*i -= 1;
if (*i < 0) {
*i = 9;
}
else {
break;
}
}
我正在尝试将一个可以无限长并用向量表示的数字减 1。举一个小例子:
vector<int> v1 = {5, 0, 0, 0};
末尾减一后的结果应该是:
vector<int> v1 = {4, 9, 9, 9};
这是我当前的代码:
int size = v1.size();
bool carry = false;
for (int i = size - 1; i > 0; i--) {
if (v1.at(i) == 0) {
v1.at(i) = 9;
if (v1.at(0) == 1) {
v1.at(0) = 0;
}
carry = true;
} else {
v1.at(i) -= 1;
carry = false;
}
}
if (carry == true && v1.at(0) == 0) {
v1.erase(v1.begin());
} else if (carry == true) {
v1.at(0) -= 1;
}
return v1;
当我测试它时,一切正常,除了像 11119 这样的数字。结果是 00019。有什么我可以调整的吗?
我觉得你没有把逻辑想清楚。
这是需要发生的事情。
如果最后一个数是0,需要改成9,并且要保留一个进位。
重复直到不需要保持进位。
该逻辑最好使用 do - while
循环来实现。这是我想出的。
int size = v.size();
bool carry = true;
int i = size - 1;
do
{
if (v.at(i) == 0)
{
v.at(i) = 9;
}
else
{
v.at(i)--;
carry = false;
}
--i;
}
while ( carry == true && i >= 0);
这是一个完整的程序
#include <iostream>
#include <vector>
void test(std::vector<int> v)
{
int size = v.size();
bool carry = true;
int i = size - 1;
do
{
if (v.at(i) == 0)
{
v.at(i) = 9;
}
else
{
v.at(i)--;
carry = false;
}
--i;
}
while ( carry == true && i >= 0);
for ( auto item : v )
{
std::cout << item << " ";
}
std::cout << std::endl;
}
int main()
{
test({1, 1, 1, 1, 9});
test({5, 0, 0, 0, 0});
}
及其输出
1 1 1 1 8
4 9 9 9 9
查看它在 https://ideone.com/lxs1vz 的工作情况。
您尝试做的减法可以这样完成:
#include <iterator>
std::vector<int> v1 = {5, 0, 0, 0};
for (std::vector<int>::reverse_iterator i = v1.rbegin(); i != v1.rend(); i++) {
*i -= 1;
if (*i < 0) {
*i = 9;
}
else {
break;
}
}