失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > C++实现大数的乘法

C++实现大数的乘法

时间:2021-12-07 17:08:24

相关推荐

C++实现大数的乘法

参考:/goomaple/article/details/7802532

/chenkai619/article/details/8991049

http://xmxoxo./6984004_d.html

首先说一下乘法计算的算法,从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果,之后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后一位,再将各项结果相加。得出最后结果。当然我们可以直接用这种方法,但要用多个链表来保存计算出的分结果,之后结果再相加得到最后结果,但是这样会浪费很多空间,我们可以再优化一下,就是只用一人链表来表示结果,先把第一位乘数与被乘数的结果保存在链表中,之后把存储结果的头部后移一位、也就是从链表的第二加起,当第二位乘数与被乘数结果加到第二之后的各个项内。以此类推,直到结束。这样就可以用一个链表来存储相乘后的结果。

在程序时应注意:

1、传入的乘数和被乘数是以字符串形式放入的话,要让指针指向最后一位,我自己写了个函数来完成这件事。链表传入也要找到最后一向来计算;

2、因为传入和保存的都是字符,所以计算时要将字符转化为数字,算完再转化为字符存储;

3、另外进位时要处理,当前的值加上进位的值再看本位数字是否又有进位;

4、输出时要逆序输出,因为链表首指针是存的结果的最低位。我的函数为了对应输入输出结果的一致性,都有采用了字符串输出,所以在输出时又将链表转为了字符串。

//没有考虑相乘的数中有负数的情况,只考虑了两个数都是正数,或者是与数字0相乘

// 首先说一下乘法计算的算法,从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果,

//之后,用第二位相乘,记录结果并且左移一位,必须左移一位,保证竖式加法的正确性。以此类推,直到计算完最后一位,再将各项结果相加。得出最后结果。

#include<iostream>

using namespace std;

bool Ismultiplyzero=false;

void multiply(char* num1,char* num2,char* result,int num1length,int num2length,int resultindex)

{

int flag=0;//标志进位

int* temp=new int[resultindex+1];//生成一个临时数组,用这个保存相乘后的值,便于累加

for(int i=0;i<=resultindex;i++)

temp[i]=0;

if(num1[0]=='0'||num2[0]=='0')//注意这里==’0‘,不能写成0

{

result[resultindex]='0';

Ismultiplyzero=true;

return;

}

for(int num1index=0;num1index<=num1length;num1index++)

for(int num2index=0;num2index<=num2length;num2index++)//乘法,做竖式加法,关键就是找出其累加位置

temp[resultindex-(num1length+num2length-num1index-num2index)]+=(num1[num1index]-'0')*(num2[num2index]-'0');

for(int i=resultindex;i>=0;i--)

{

temp[i]+=flag;

flag=temp[i]/10;

temp[i]%=10;

}

for(int k=resultindex;k>=0;k--)

result[k]=temp[k]+'0';

}

//下面是别人写的大数乘法的代码,很有意思。它不是倒着从数组高位开始存储的,而是从低位开始的

/*void multiply(char* a,char* b,char* c)

{

int i,j,ca,cb,* s;

ca=strlen(a);

cb=strlen(b);

s=(int*)malloc(sizeof(int)*(ca+cb));

for (i=0;i<ca+cb;i++)

s[i]=0;

for (i=0;i<ca;i++)

for (j=0;j<cb;j++)

s[i+j+1]+=(a[i]-'0')*(b[j]-'0');//找规律找到存储乘积的坐标对应的位置,本来是i+j,但是考虑到最高位可能有进位所以i+j+1

for (i=ca+cb-1;i>=0;i--)

if (s[i]>=10)

{

s[i-1]+=s[i]/10;

s[i]%=10;

}

i=0;

while (s[i]==0)

i++;

for (j=0;i<ca+cb;i++,j++)

c[j]=s[i]+'0';

c[j]='\0';

free(s);

}*/

void print(char*num,int nlength)

{

bool isbegining=true;

if(Ismultiplyzero==true)

{

cout<<'0'<<endl;

return;

}

for(int i=0;i<nlength;i++)

{

if(num[i]!='\0')

{

if(isbegining&&num[i]!='0')//因为之前预留了空位,所以位数不够nlength位,之前为0,为了符合打印习惯,从左往右找到第一个非‘0’的值

isbegining=false;

if(!isbegining)

cout<<num[i];

}

}

cout<<endl;

}

int main()

{

char num1[]="25";

char num2[]="25";

int num1length=strlen(num1)-1;//数组是从0开始

int num2length=strlen(num2)-1;//数组是从0开始

int maxlength=(num1length>num2length)? num1length:num2length;

int resultlength=maxlength+10;

int resultindex=resultlength;//用于addition函数中数组result的标号

char* result=new char[resultlength];

memset(result,'0',resultlength-2);//减2是因为数组是从0开始,数组最后一位放置结束符。结果数组清0,调用了memset函数,注意是赋值‘0’而不是0,否则出错

result[resultlength-1]='\0';//数组添加结束符

resultindex--;//减掉一位,因为最后一位不放任何内容,只放结束符

multiply(num1,num2,result,num1length,num2length,resultindex);

print(result,resultlength);

delete [] result;

return 0;

}

如果觉得《C++实现大数的乘法》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。