Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将整数分解为数字,并按相同顺序将数字分配给向量?_C++_Loops_Vector_Bits - Fatal编程技术网

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 << " ";
}