参考:http://blog.csdn.net/goomaple/article/details/7802532

http://blog.csdn.net/chenkai619/article/details/8991049

http://xmxoxo.blog.hexun.com/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++实现大数的乘法相关推荐

  1. 任意长度的两个大数的乘法

    方法(一): 关于大数乘法,可以使用数组来模拟小学三年级的乘法竖式计算过程,代码如下: #include "iostream" #include "string" ...

  2. 7-41 大数的乘法 (10 分)

    7-41 大数的乘法 (10 分) 输入一个大正整数和一个非负整数,求它们的积. 输入格式: 测试数据有多组,处理到文件尾.每组测试输入1个大正整数A(位数不会超过1000)和一个非负整数B(int范 ...

  3. java 乘法_java大数加法乘法

    java大数加法乘法 前言 正常情况下我们调用加法乘法使用符号就行了,但是如果超出限制了,那就只能调用BigDecimal里面的函数了,但是有的时候oj考察的就是希望自己实现,所以就可以采用别的方法. ...

  4. Java大数加法乘法减法、36进制加法

    文章目录 大数加法 大数减法 c++版本 Java版本 大数乘法 36进制加法 c++版 Java版 大数加法 1.是整数: 2.两个数无限大,long都装不下: 3.不能用BigInteger: 4 ...

  5. 大数求乘法逆元c语言,乘法逆元(编程计算)+两道版题

    前言 看到这里的小盆友们千万不要以为这个东西很难,其实就是个1+1->1(1个定义+1个定理->1坨乘法逆元).Let's begin.web 有关乘法逆元定义 这个咱们就不要玩笑了,来, ...

  6. 百炼---大数的乘法

    恩,题目很简单,学习一种思路吧. 123*123=: 1  2  3 1  2  3 ------------------------- 3  6  9 2  4  6 1  2  3 ------- ...

  7. 杭电1042—— N!(大数乘法的应用!)

    N! Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N i ...

  8. c语言浮点数乘法算法,单精度浮点数乘法的实现

    按:计算机组成课程第四周作业 算法证明 图表 1       浮点数的表示 浮点数的表示如上图所示,我们要做的是将按如上方式存储的两个浮点数相乘,将其结果用如上的方式表示. 符号位只是两者的异或,指数 ...

  9. C++大数乘加减除比较操作集(含测试原码)

    本博文源于C语言基础,旨在解决大数的乘法.加法.减法.除法.比较运算的操作.并给出测试效果. 测试效果 大数的存储方式 struct bign{int d[1000];int len;bign(){m ...

最新文章

  1. 深入剖析ISAServer 网页缓存及配置
  2. 并发编程-26 高并发处理手段之服务降级与服务熔断 + 数据库切库分库分表
  3. mysql不同字段full join_Mysql实现full join的替换方法
  4. 如何用Vue实现简易的富文本编辑器,并支持Markdown语法
  5. spring+ibatis配置
  6. 揭晓阿里云神龙团队拿下TPCx-BB排名第一的背后技术
  7. 三大运营商2019年财报:收入增长乏力 非通信业务有亮点
  8. python中的map对象_python map对象
  9. 代数余子式与伴随矩阵
  10. 如何改变iTunes默认备份文件目录
  11. dell商务计算机主机闪烁黄灯,戴尔电脑开不了机 已经几天了 主机灯橙色 闪闪的...
  12. 计算机全选的键盘,全选快捷键是什么,教您电脑全选快捷键是什么
  13. 2019 年终总结,168 篇,已归类!
  14. Linux 安装php-cs-fixer
  15. 灵魂画手教你浅拷贝与深拷贝
  16. 2022年制冷与空调设备运行操作考试练习题及模拟考试
  17. MEM/MBA 写作-论说文(03)立意 答案解析
  18. LONGLONG类型
  19. 国际短信接口文档-json
  20. 程序常用英文单词 commonly used English word in program

热门文章

  1. 2020年人工神经网络第二次作业-参考答案第三题
  2. grpc通信原理_容器原理架构详解(全)
  3. python语法错误概述_python语法错误
  4. linux批量用户创建,linux 批量用户的创建
  5. php左右值实现无限极分类,基于ThinkPHP的二叉树左右值无限极分类实现
  6. 【SRIO】3、RapidIO串行物理层的包传输过程
  7. 八、pyqt5按钮类控件——QPushButton、QRadioButton、QCheckBox
  8. 如何修复网站漏洞Discuz被挂马 快照被劫持跳转该如何处理
  9. 实验long raw 和 blob两种数据类型遇到dblink的表现
  10. 【大吉大利 今晚吃包】002 - array-first