大整数相乘——链表和数组实现

来源:互联网 发布:ubuntu系统字体 编辑:程序博客网 时间:2024/06/06 01:24

1.数组实现

#include <iostream>using namespace std;void mul(char *a, char *b){char *pa = a, *pb = b;char c[100] = { 0 };//存放结果的位,初始化为0//now表示被乘数(存放在b中)的第now+1位//temp表示当前正在计算的位int now = 0, temp = 0;while (pb[now]){//未到达pb末尾时temp = now;int bit = pb[now] - 48;//0的asicc码为48int left = 0, sum = 0;//left表示余数,sum表示当前位数计算的总和int aCount = 0;//aCount存放当前计算到乘数的第几位while (pa[aCount] || left){ //乘数所有位数计算完毕 且 没有进位时 终止if (!pa[aCount]){//乘数所有位数计算完毕,进位值放入结果的最高位c[temp] = left;break;}elsesum = c[temp] + bit*(pa[aCount] - 48) + left;c[temp] = sum % 10;left = sum / 10;aCount++;temp++;}now++;aCount = 0;}int i = 99;while (!c[i--]);//运行到非零处i++;while (i >= 0)cout << (int)c[i--];cout << endl;}int main(){char a[100], b[100];cin >> a >> b;//因为两数都是从低位开始乘,应将字符串反转mul(_strrev(a), _strrev(b));    return 0;}
当时在这段代码中没有添加break
if (!pa[aCount]){//乘数所有位数计算完毕,进位值放入结果的最高位c[temp] = left;break;}
每次运行都有异常访问错误,调试跟踪了好久,发现aCount的值居然大于100了,最后才定位到了这里发现了错误。

算是练习下调试能力吧!


2.链表实现

#include <iostream>#include <Windows.h>using namespace std;struct Node{Node(byte a, Node *b){date = a;next = b;}byte date;Node* next;};void output(Node *head){//递归输出if (head->date == 0 && head->next == 0)return;output(head->next);cout << (int)(head->date);}void mul(char *a, char *b){char *pa = a, *pb = b;Node* head = new Node(0, NULL);//若被乘数(pb)正在运算第i位,pNodeNow指向从头结点开始向后移i-1个节点//pNodeTemp表示正在计算的位,pNodeNext在pNodeTemp后一个节点Node *pNodeNow = head, *pNodeNext = NULL, *pNodeTemp = NULL;pNodeNow = head;while (*pb){//pb不为'/0'时int bit = *pb - 48;//0的asicc码为48int temp = 0,//temp表示进位sum = 0;//sum表示当前节点数据的总和pNodeTemp = pNodeNow;pNodeNext = pNodeTemp->next;while (*pa || temp){//乘数所有位数计算完毕 且 没有进位时 终止if (!pNodeNext){//pNodeNext为空节点则建立新节点pNodeNext = new Node(0, NULL);pNodeTemp->next = pNodeNext;}//判断乘数(pa)是否遍历完if (*pa == 0){sum = temp;}else{sum = pNodeTemp->date + (*pa - 48)*bit + temp;pa++;}pNodeTemp->date = sum % 10;//存放余数temp = sum / 10;//存放进位值//pNodeTemp,pNodeNext两节点都后移pNodeTemp = pNodeNext;pNodeNext = pNodeNext->next;}pa = a;pb++;pNodeNow = pNodeNow->next;}output(head);cout << endl;}

计算结果如图



0 0