我正在尝试添加两个由链接列表表示的数字。所以我插入了数字3-> 2-> 8和6-> 5-> 4。我试图得到数字328和654,然后添加两个并将它们插入第三个列表。我在计算数字时遇到了一些问题。这是代码。
#include<bits/stdc++.h>
using namespace std;
struct Node{
int data;
struct Node *next;
};
int flag=1;
void input(Node **head,int num)
{
Node *temp=(struct Node*)malloc(sizeof(struct Node));
temp->data=num;
if(!flag)temp->next=*head;
if(flag){temp->next=NULL;flag=0;}
*head=temp;
}
void add(Node *l1,Node *l2,Node *l3)
{
Node *cur1=l1;
Node *cur2=l2;
int size1=0,size2=0;
while(cur1!=NULL)
{
size1++;
cur1=cur1->next;
}
while(cur2!=NULL)
{
size2++;
cur2=cur2->next;
}
int i=size1-1,j=size2-1,sum1=0,sum2=0;
cur1=l1;cur2=l2;
cout<<i<<endl;
while(cur1!=NULL)
{
cout<<cur1->data<<"\t";
cout<<cur1->data*pow(10,i)<<"\t";
sum1=sum1+cur1->data*pow(10,i);
cout<<sum1<<endl;
i--;
cur1=cur1->next;
}
cout<<sum1<<endl;
while(cur2!=NULL)
{ cout<<cur2->data<<"\t";
cout<<cur2->data*pow(10,j)<<"\t";
sum2=sum2+cur2->data*pow(10,j);
cout<<sum2<<endl;
j--;
cur2=cur2->next;
}
cout<<sum2<<endl;
sum1+=sum2;
while(sum1!=0)
{
int r=sum1%10;
input(&l3,r);
sum1/=10;
}
cur1=l3;
while(cur1!=NULL)
{
cout<<cur1->data;
cur1=cur1->next;
}
}
int main()
{
Node *l1=NULL;
Node *l2=NULL;
Node *l3=NULL;
input(&l1,8);
input(&l1,2);
input(&l1,3);
flag=1;
input(&l2,4);
input(&l2,5);
input(&l2,6);
add(l1,l2,l3);
return 0;
}
我得到了输出
2 //value of i
3 300 299 //cur1->data*pow(10,i) is initially 300 then becomes 299
2 20 319
8 8 327
327 //total sum which should be 328
6 600 599 //Same problem
5 50 649
4 4 653
653 //total sum which should be 654
980 //sum of 327 and 653
答案 0 :(得分:2)
问题可能是由于截断。 pow
函数返回浮点数。然后将其转换为整数,从而导致截断。
示例:
299.99999999 as float will become 299 as int
尝试先加0.5,然后进行四舍五入。
像:
sum1=sum1+(cur1->data*pow(10,i) + 0.5);
正如@viraptor评论的那样,避免浮动(即战俘)更好。尝试类似:
sum1 = 0;
while(cur1 != NULL)
{
sum1 = 10 * sum1;
sum1 = sum1 + cur1->data;
cur1=cur1->next;
}
然后所有计算都在整数上完成,由于float和int之间的转换,你不会遇到问题。
答案 1 :(得分:0)
该代码很难遵循。您可以简单地对(简单的)链接列表求和,而不是提取每个列表的值,将它们相加然后存储结果。
下面是一个简单的示例。请注意,carry
必须作为参考传递,因此调用者在展开堆栈时可以访问修改后的值。此外,此示例还假定两个列表具有相同数量的节点。如果没有,您可以将0
添加到最短列表中。
// basic node structure
template <typename T>
struct Node
{
T data = 0;
Node<T>* next = nullptr;
};
// function to sum 2 simply linked lists
Node<int>* sumLists(Node<int>* l1, Node<int>* l2, int& carry, int k = -1)
{
if (!l1 && !l2)
{
// we reached the end of both lists
return nullptr;
}
++k; // index of the largest list
// iterate to the end of both lists, head is the head of the result list
auto head = sumLists(l1 ? l1->next : l1, l2 ? l2->next : l2, carry, k);
// compute the value and carry
int value = carry;
if (l1) value += l1->data;
if (l2) value += l2->data;
carry = value / 10;
// insert the value into the result list
Node<int>* node = new Node<int>();
node->data = value % 10;
if (!head)
{
head = node;
}
else
{
node->next =head;
head = node;
}
// add carry for the last iteration
if ((k == 0) && (carry != 0))
{
Node<int>* node = new Node<int>();
node->data = carry;
node->next = head;
head = node;
}
return head;
}