DHU-链表-长整数加法运算

    技术2022-07-14  68

    9 长整数加法运算

    问题描述 :

    假设2个任意长度的整数x、y分别由双向链表A和B存储,现要求设计一个算法,实现x+y。计算结果存储在链表C中。

    说明:

    由于A和B输出时需要从头至尾遍历,而做加法时需要从尾至头遍历,因此使用双向链表存储。 可以从长整数的低位开始拆分(4位为一组,即不超过9999的非负整数),依次存放在链表的每个结点的数据域中;头结点的数据域存放正负数标志(正数或0:1,负数:-1)。

    输入说明 :

    第一行:长整数x 第二行:长整数y

    输出说明 :

    第一行:格式化后的长整数x(从低位到高位每4位用",“分开) 第二行:格式化后的长整数y(从低位到高位每4位用”,“分开) 第三行:空行 第四行:单链表C的遍历结果 第五行:格式化后的计算结果(从低位到高位每4位用”,"分开) (输入与输出之间用一空行分隔)


    这题写麻烦了,感觉下次还是要分几个程序写看着清楚一点。 思路:可以将负号乘给每一个元素,用head3链表来接收新的结果,再对head3->next->value结果进行判断,如果是负数,那整体都乘以-1,如果是正数,就直接从最后一位进行进位处理。 注意点:有一个例子比较特殊:当两个数字加起来是0的时候,要分类讨论。

    #include <iostream> #include <vector> using namespace std; struct Listnode{ Listnode *prior; Listnode *next; int value; }; Listnode* createlist(vector<char>v){ Listnode *head = new Listnode;//头节点 Listnode *cur = new Listnode; cur = head; head->value = 1; int len = v.size(); for(int i = 0 ; i < len ; i++){ if(i == 0 && v[i] == '-'){ head->value = -1; continue; } Listnode *temp = new Listnode; temp->value = v[i]-'0'; cur->next = temp; temp->prior = cur; cur = cur->next; temp->next = NULL; } return head; } int countnum(Listnode* head){ Listnode *cur = new Listnode; cur = head; int sum; if(head->next && head->next->value >= 10){ head->next->value = head->next->value - 10; Listnode *p = new Listnode; p->value = 1; p->next = head->next; p->prior = head; p->next->prior = p; head->next = p; } else{ sum = 0; } while(cur->next != NULL){ sum++; cur = cur->next; } return sum; } void printlist1(Listnode* head){ Listnode *fin = new Listnode; fin = head; int key = 0; while(fin->next && fin->next->value == 0){ fin = fin->next; key = 1; } if(key == 1){ head = fin->prior; } int test = 0; int c = countnum(head); int cc = c%4; Listnode *q = head->next; while(cc){ if(q->value < 0){ cout<<(-1) * q->value; }else{ cout<<q->value; } q = q->next; cc--; } if(c%4 != 0 && c>=4){ cout<<"->"; } while(q != NULL){ if(q == NULL){ cout<<endl; break; } if(test == 4){ test = 0; cout<<"->"; } test++; cout<<q->value; q = q->next; } cout<<endl; } void printlist2(Listnode* head,int flag){ if(flag == 1){ cout<<'-'; } Listnode *fin = new Listnode; fin = head; int key = 0; while(fin->next && fin->next->value == 0){ fin = fin->next; key = 1; } if(key == 1){ head = fin->prior; } int test = 0; int c = countnum(head); int cc = c%4; Listnode *q = head->next; while(cc){ cout<<q->value; q = q->next; cc--; } if(c%4 != 0 && c>=4){ cout<<","; } while(q != NULL){ if(q == NULL){ cout<<endl; break; } if(test == 4){ test = 0; cout<<","; } test++; cout<<q->value; q = q->next; } } int main(){ string s1; string s2; cin>>s1>>s2; int len1 = s1.size(); int len2 = s2.size(); vector <char> v1; vector <char> v2; for(int i = 0;i < len1 ; i++){ v1.push_back(s1[i]); } for(int i = 0;i < len2 ; i++){ v2.push_back(s2[i]); } Listnode *head1 = createlist(v1); Listnode *head2 = createlist(v2); int temp1 = len1; int temp2 = len2; if(s1[0] == '-'){ temp1--; } if(s2[0] == '-'){ temp2--; } while(temp1 >= 4){ temp1 = temp1 - 4; } while(temp2 >= 4){ temp2 = temp2 - 4; } if(head1->value == -1){ cout<<'-'; } Listnode *cur1 = head1->next; Listnode *cur2 = head2->next; for(int i = 0;i < temp1; i++){ cout<<cur1->value; cur1 = cur1->next; } if(temp1 != 0 && len1 >= 4){ cout<<','; } int sum = 0; while(cur1 !=NULL){ if(sum == 4){ cout<<','; sum = 0; } sum++; cout<<cur1->value; cur1 = cur1->next; } cout<<endl; if(head2->value == -1){ cout<<'-'; } for(int i = 0;i < temp2; i++){ cout<<cur2->value; cur2 = cur2->next; } if(temp2 != 0 && len2 >= 4){ cout<<','; } sum = 0; while(cur2){ if(sum == 4){ cout<<','; sum = 0; } sum++; cout<<cur2->value; cur2 = cur2->next; } cout<<endl<<endl; Listnode *end1 = new Listnode; Listnode *end2 = new Listnode; end1 = head1; end2 = head2; while(end1->next != NULL){ end1 = end1->next; }//end1指向尾部 while(end2->next != NULL){ end2 = end2->next; }//end2指向尾部 Listnode *head3 = new Listnode; head3->next = NULL; if(s1[0] == '-'){ Listnode *ss = new Listnode; ss = head1; while(ss->next){ ss = ss->next; ss->value = (-1) * ss->value; } } if(s2[0] == '-'){ Listnode *ss = new Listnode; ss = head2; while(ss->next){ ss = ss->next; ss->value = (-1) * ss->value; } } while(end1 != head1 && end2 != head2){ int cc = end1->value + end2->value; Listnode *c = new Listnode; c->value = cc; c->next = head3->next; c->prior = head3; if(c->next){ c->next->prior = c; } head3->next = c; end1 = end1->prior; end2 = end2->prior; } while(end1 != head1){ int cc = end1->value; Listnode *c = new Listnode; c->value = cc; c->next = head3->next; c->prior = head3; if(c->next){ c->next->prior = c; } head3->next = c; end1 = end1->prior; } while(end2 != head2){ int cc = end2->value; Listnode *c = new Listnode; c->value = cc; c->next = head3->next; c->prior = head3; if(c->next){ c->next->prior = c; } head3->next = c; end2 = end2->prior; } Listnode *last = new Listnode; last = head3; int flag = 0; if(head3->next->value < 0){ while(last->next){ last = last->next; last->value = (-1) * last->value; flag = 1; } } else{ while(last->next){ last = last->next; } } while(last != head3->next){ if(last->value >= 10){ last->value = last->value - 10; last->prior->value++; } if(last->value <0){ last->value = last->value + 10; last->prior->value--; } last = last->prior; } printlist1(head3); printlist2(head3,flag); }
    Processed: 0.026, SQL: 9