C++ 如何使用向量<;int>;进行非常大的整数乘法
我试图用向量来做非常大的乘法运算,在运行我的算法时,我一直遇到一个问题C++ 如何使用向量<;int>;进行非常大的整数乘法,c++,C++,我试图用向量来做非常大的乘法运算,在运行我的算法时,我一直遇到一个问题 vector<vector<int>> finalresult; vector<int> currentrow; int carry=0, workingnum=0, innerval =0, curnt=0, j=0; for (auto an = a.rbegin(); an != a.rend(); ++an) { for (auto bn = b.rbegin(); bn
vector<vector<int>> finalresult;
vector<int> currentrow;
int carry=0, workingnum=0, innerval =0, curnt=0, j=0;
for (auto an = a.rbegin(); an != a.rend(); ++an)
{
for (auto bn = b.rbegin(); bn != b.rend(); ++bn)
{
curnt = (*an) * (*bn);
if (curnt > 10 && carry ==0)
{
carry = curnt / 10;
currentrow.push_back(curnt % 10);
}
if (curnt < 10 && carry ==0)
{
currentrow.push_back(curnt);
}
if (curnt < 10 && carry >0)
{
if ((curnt + carry) < 10)
{
currentrow.push_back(curnt + carry);
}
else
{
workingnum = curnt + carry;
carry = workingnum / 10;
currentrow.push_back(workingnum % 10);
}
}
else
{
workingnum = curnt + carry;
carry = workingnum / 10;
currentrow.push_back(workingnum % 10);
}
}
finalresult.push_back(currentrow);
for (int i = 0; i < currentrow.capacity(); i++)
{
currentrow.pop_back();
}
for (int i=0; i < j; i++)
{
currentrow.push_back(0);
}
j++;
}
向量最终结果;
矢量电流行;
int进位=0,workingnum=0,innerval=0,curnt=0,j=0;
对于(自动an=a.rbegin();an!=a.rend();++an)
{
对于(自动bn=b.rbegin();bn!=b.rend();++bn)
{
电流=(*an)*(*bn);
如果(电流>10&&进位==0)
{
进位=电流/10;
当前行。推回(当前值%10);
}
if(电流<10&&carry==0)
{
当前行。推回(当前);
}
如果(电流<10且进位>0)
{
如果((电流+进位)<10)
{
当前行。推回(电流+进位);
}
其他的
{
workingnum=电流+进位;
进位=工作数/10;
currentrow.push_back(工作编号%10);
}
}
其他的
{
workingnum=电流+进位;
进位=工作数/10;
currentrow.push_back(工作编号%10);
}
}
最终结果。推回(当前行);
对于(int i=0;i
每次运行该代码时,如果它碰到一个内部if语句,比如if curnt<10和carry==0,它将向后推curnt,但在else部分也会再次这样做。我无法理解为什么它也发生在else部分。(我知道这是因为调试而发生的事情)有人能解释一下吗?你有:
if (curnt < 10 && carry >0)
{
if ((curnt + carry) < 10)
{
currentrow.push_back(curnt + carry);
}
else
{
workingnum = curnt + carry;
carry = workingnum / 10;
currentrow.push_back(workingnum % 10);
}
}
else
{
workingnum = curnt + carry;
carry = workingnum / 10;
currentrow.push_back(workingnum % 10);
}
借
在维基百科中查找bignum库怎么样?我想大多数人都会使用gnu。我建议你评论一下你的代码。如果你把面包屑留给自己,分析代码可能会更容易。这不是一个真正的代码问题,而是一个文档/意图/清晰性问题。另外,curnt==10的情况如何?我对我的结束有一些评论,觉得它们不需要在这里,所以我把它们拿了出来。curnt==10在else语句中处理。else是否仅与else语句正上方的if语句绑定?如果是这样的话,那么所有的if减去第一个if是否应该是‘else if’?@lups,yes和yes。您也可以使用我在回答中建议的简化版本。@R Sahu,啊,我不明白您建议替换那里的所有内容。谢谢你的回答。
if (curnt > 10 && carry ==0)
{
carry = curnt / 10;
currentrow.push_back(curnt % 10);
}
if (curnt < 10 && carry ==0)
{
currentrow.push_back(curnt);
}
if (curnt < 10 && carry >0)
{
if ((curnt + carry) < 10)
{
currentrow.push_back(curnt + carry);
}
else
{
workingnum = curnt + carry;
carry = workingnum / 10;
currentrow.push_back(workingnum % 10);
}
}
else
{
workingnum = curnt + carry;
carry = workingnum / 10;
currentrow.push_back(workingnum % 10);
}
curnt += carry;
carry = curnt / 10;
currentrow.push_back(curnt % 10);