【问题标题】:Multiply two large numbers represented as linked lists将表示为链表的两个大数相乘
【发布时间】:2019-03-16 11:28:45
【问题描述】:

我试图将表示为链接 lilsts 的 2 个大数字相乘(重载运算符 *),但似乎有一个错误。有谁能帮帮我吗?我认为乘法函数是正确的,因为我已经对其进行了测试。 但是当我尝试超载操作员时,我似乎无法指出问题所在*..... 我试过循环遍历一个列表并与另一个列表中的每个节点相乘。额外分割2个大数的技巧?谢谢你!这是我的代码:

Numar *Numar :: operator* (Numar *nr2) //overloading operator*
{
Lista *L = new Lista;
Numar *rezultat = new Numar(L);//links the list to the number 
Lista *aux = new Lista;
Numar *rez2 = new Numar(aux); //an auxiliary 
int t = 1;
Nod *p2 = this->L->prim; //1st node of this
while (p2) //loop the 2nd number
{
rez2 = nr2->multiply(p2->info * t); //multiply the 1st list with an int
cout<<"rez2 "<<rez2;
rezultat = *rezultat + rez2;
cout<<"rezultat "<<rezultat;
t *= 10; //that carry 
p2 = p2->next;
}
return rezultat;
}

获取完整代码https://pastebin.com/PcXuM9EL

【问题讨论】:

  • 只是将你的代码中的一个函数扔给人们并说它不起作用并不能给他们任何有用的信息。链表可以通过多种方式表示“大数”,因此可以通过多种方式实现这些“大数”的乘法。投票结束,因为不清楚。
  • @Peter 是对的,当然。不过,与此同时,您可能会将所有相关的int 更改为long long。根据数字的大小,这可能会改善您的问题。但是,long long 也可能溢出。 long long 类型通常为 64 位宽。

标签: c++ list overloading operator-keyword


【解决方案1】:

问题是这个定义不适用于你打算做的事情;

Numar *Numar :: operator* (Numar *nr2) 

如果要定义类型 Numaroverload arithmetic operators,则需要处理值(最终是 const 或 rvalue 引用)而不是指针。否则,一旦进行一些临时计算,您就会泄漏内存。

所以你需要修改你的代码设计,这样你最终会得到以下签名:

Numar Numar :: operator* (Numar nr2) 

为此,NumarLista 需要实现 rule of 3

编辑:为了避免在不必要时复制值,您可能希望——正如 cmets 中的 1201programalarm 所建议的那样——去:

Numar Numar :: operator* (const Numar& nr2) 

但是考虑到 const,这可能需要在定义您在 nr2 上调用的成员函数时进行一些纪律。

【讨论】:

  • 这应该是 Numar Numar :: operator* (const Numar &amp;nr2) 以避免复制 Numar 对象,这看起来会很昂贵(至少调用一次 new)。
  • @1201ProgramAlarm 是的,这确实是个好主意!在答案中有一个指向另一个问题的链接,其中更详细地讨论了操作员的通常签名。但我会编辑以突出这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多