C++ 如何将整数分解为数字,并按相同顺序将数字分配给向量?
我使用构造函数将一个C++ 如何将整数分解为数字,并按相同顺序将数字分配给向量?,c++,loops,vector,bits,C++,Loops,Vector,Bits,我使用构造函数将一个无符号int作为参数,将其分解为数字,并将相应的true和false值分配给向量对象。但问题是,我糟糕的逻辑按照相反的顺序分配值,因为最后一个数字是先分开的,依此类推。我写的代码是: vector<bool> _bits; uBinary(unsigned int num){ int i = 1; while(num > 0) { int d = num%10; num /= 10;
无符号int
作为参数,将其分解为数字,并将相应的true
和false
值分配给向量
对象。但问题是,我糟糕的逻辑按照相反的顺序分配值,因为最后一个数字是先分开的,依此类推。我写的代码是:
vector<bool> _bits;
uBinary(unsigned int num){
int i = 1;
while(num > 0)
{
int d = num%10;
num /= 10;
_bits.resize(i++);
if(d == 1)
{
_bits[_bits.size() - 1] = true;
}
else if(d==0)
{
_bits[_bits.size() - 1] = false;
}
}
}
vector\u位;
无符号整数{
int i=1;
while(num>0)
{
int d=num%10;
num/=10;
_bits.resize(i++);
如果(d==1)
{
_位[_bits.size()-1]=真;
}
else如果(d==0)
{
_位[_bits.size()-1]=false;
}
}
}
例如:如果将参数10011传递给函数uBinary()
,向量对象将按以下顺序分配值11001
或true、true、false、true
,顺序相反。
这里我需要做的就是,我想分配值而不颠倒顺序,我不想为此使用另一个循环。一种方法是从可能的最高数字开始(
无符号int
在大多数平台上最多只能容纳4294967295个值),并忽略前导零,直到找到第一个实际数字:
for (uint32_t divisor = 1000000000; divisor != 0; divisor /= 10) {
uint32_t digit = num / divisor % 10;
if (digit == 0 && _bits.size() == 0 && divisor != 1)
continue; // ignore leading zeros
_bits.push_back(digit == 1);
}
但是,以相反的方式查找数字,然后简单地将其反转要简单得多(而且至少同样有效):
使用另一个循环或
std::reverse
进行反转的一种方法是使用递归。使用递归,您可以沿着int向下走,直到到达最后一位,然后在调用返回时将值添加到向量中。那看起来像
void uBinary(unsigned int num)
{
if (num == 0)
return;
uBinary(num / 10);
_bits.push_back(num % 10 ? true : false);
}
你可以看到与之合作
int main()
{
uBinary(10110);
for (auto e : _bits)
std::cout << e << " ";
}
intmain()
{
普遍的(10110);
用于(自动e:_位)
std::cout cheat并使用std::位集
:),如果您想在结束时不反转(这是迄今为止最简单的方法),您需要提前知道位数,这需要循环或调用log10
。我建议您使用std::string
进行输入,但是,可能这样做很容易;如果用户输入,它将是一个字符串(这比所有这些整数除法更有效…)。您当前可以使用\u位[\u位.size()-1]=true
,而不是\u位。向后推(true)
,并以相反的顺序插入\u位(\u位.begin(),true)
。但最后的反向
更简单、更有效(因为向量的push_front是O(N)
)。很好的解决方案,没有考虑递归:-)当只有一个0位时,它不会处理。谢谢。很好的一个…但它不会有更大的时间复杂度吗?@HNLearner它应该是O(N)它所具有的是调用栈开销,但递归深度不太深,这是非常小的开销。好的,先生。我没有想到递归。这也是一个很好的例子。):RaKeE1111,我只是使用OP所拥有的。AFC++(代码)>
int main()
{
uBinary(10110);
for (auto e : _bits)
std::cout << e << " ";
}