我将字符串转换为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?
答案 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,不知道如何在这样的容器上实现算术。