【问题标题】:String To Int For BigInt Manual Conversion用于 BigInt 手动转换的 String 到 Int
【发布时间】:2014-04-15 02:24:56
【问题描述】:

我在将字符串转换为 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>4 或 rads==Rads

我也尝试过:

保存为基础#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?

【问题讨论】:

  • 数字永远不会有前导零。仅在打印值时添加前导零。

标签: string c++11 int


【解决方案1】:

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

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

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

【讨论】:

  • 您在谈论什么是“显而易见的”。我正在拆分长字符串。 size()>18 成 5 位整数,我找不到保存它的方法,并用于算术运算,以获取列表中每个元素的固定大小
  • @EpiGen:对不起,我不知道你在说什么。
  • 那你为什么发“回答”而不是“评论”?你知道有没有程序员不知道在任何给定的整数中,无论是写在纸上还是写在代码中,“前导零”都是没有意义的???
  • @EpiGen:我回答了这个问题。然后,你评论了它。不幸的是,我不明白你的评论。至于你的最新问题,是的,我每周都会在 Stack Overflow 上看到这种困惑。你的问题表现出这种困惑。如果您确实了解前导零,那么您应该让您的问题更清楚,因为现在看起来不是这样。
  • 有:" 如果输入数字是:10000 00012 02345 00001 在列表中我会得到:10000 12 2345 1 这还不够清楚吗?
【解决方案2】:

所以,看来我必须接受挑战并努力研究加、减、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;
    }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2014-01-27
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    相关资源
    最近更新 更多