字符串到Int用于BigInt手动转换

时间:2014-03-11 12:53:34

标签: string c++11 int

我将字符串转换为int时遇到问题,需要在每个std :: list元素中保存一个5位数字。我用这个:

for(int i =0; i< e.length(); ++i)
{
    tmp = tmp*10+ e[i] - '0';
    ++rads;
    if(rads>4) 
    {
       numbs.push_back(tmp);
       rads=0;
       tmp=0;
    }
}

如果输入的数字是:

  

10000 00012 02345 00001

列表中的

我会得到:

  

10000 12 2345 1

所有问题都是在

之后保存而不会丢失零
  

rads&gt; 4或rads == Rads

我也尝试过:

  

保存为base#define-d Rads

for(int i =0; i< e.length(); ++i)
{
    tmp = tmp*10+ e[i] - '0';
    if(tmp>=Rads) // Rads defined as 10000
    {
       cumul = cumul*10+tmp/Rads;
       tmp = tmp%Rads;
    }
   if(cumul>=Rads) // Rads defined as 10000
    {
       numbs.push_back(cumul);
       cumul = 0;
    }

}

我已阅读并查看了与此相关的各种源代码和文章,其中没有一个是合适的解决方案(不是代码,但至少是想法)或解决方案是保存为int / char [一位数] 。一个是最简单的方法,但处理一个只占用2 ^ 4位的int会太昂贵。这就是为什么我正在寻找在x32字中保存5位整数的方法,因此可以适应工作时间限制并避免重写已经实现的代码“+ - / *%” 在搜索中,在我附近贴出的问题或多或少是How to split big numbers?

2 个答案:

答案 0 :(得分:2)

“前导零”是如何为人类观看呈现数字的属性(即包含数字字符的字符串)。它们不是价值本身所固有的。

因此,前导零实际上并不存在。

如果您愿意,可以将前导零添加到最终输出中。

答案 1 :(得分:0)

所以,似乎我必须接受挑战,并在加,减,mul和div上使用更难的算法。 现在输入是这样的:

 unsigned int tmp = 0, cumul = 0, rads = 0;
    for(int i =0; i< e.length(); ++i)
    {
        tmp = tmp*10+e[i]-'0';
        if(tmp>=10000)
        {
            numbs.push_back(tmp);
            tmp =0;
        }
        else if(!tmp)
        {
            while(rads<5 && e[i]=='0')
            {
                ++rads; ++i;
            }
            --i;                                        //decrement following main loop increment
            numbs.push_back(ZBit+rads); // rads hold number of zeros after first 
                                                        //occurence
            //cout<<"Processed "<<rads<<" zeros"<<endl;
            rads = 0;
        }
    }
    if(tmp>0){numbs.push_back(tmp);}

输出:

list<unsigned int>::iterator it= numbs.begin();
    for(unsigned int i = 0; i<numbs.size(); i++)
    {
         if(*it>ZBit)
         {
             while(*it>ZBit)
             {
                 *it = *it - 1;
                 cout<<'0';
                     }
         }
        else{cout<<*it;}
            ++it;
    }

现在它在每个*中保存2-5个零作为ZBit + rads,不知道如何在这样的容器上实现算术。