问题:
由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。大数运算主要有加、减、乘三种方法。
下面就是用分治算法解决“大数相乘”问题。

分治算法解题的一般步骤:

  • 分解:将要解决的问题划分为若干个规模较小的同类问题
  • 求解:当子问题划分的足够小时,用较简单的方法解决
  • 合并:按原问题的要求,将子问题的解逐层合并构成原问题的解
#include<iostream>
using namespace std;
#include<string.h>#define MAXSIZE 1000int *result; //定义全局整型数组,存放结果 int Multipy(char*a,int ai,int aj,char*b,int bi,int bj,int move){if(aj-ai <=1 && bj-bi <= 1){  //当子问题为两位数和两位数相乘或者更小时int t1,t2;t1 = a[ai] - 48;if(aj != ai)t1 = t1*10+(a[aj] - 48);t2 = b[bi] - 48;if(bj != bi)t2 = t2*10+(b[bj] - 48); result[move] += t1*t2;return 1;}int m = (ai+aj)/2;int n = (bi+bj)/2;int s = aj - m;int k = bj - n;Multipy(a,ai,m,b,bi,n,s+k+move); //对问题的分解Multipy(a,m+1,aj,b,n+1,bj,move);Multipy(a,m+1,aj,b,bi,n,k+move);Multipy(a,ai,m,b,n+1,bj,s+move);
}int Arrange(int *a){ //将result数组中的值进行整理,方便输出int i = 0;int t,p1,p2;while(a[i] != 10000){  //以特殊数为终止条件 if(a[i] < 10);else if(a[i] < 100){t = a[i] % 10;p1 = a[i] / 10;a[i] = t;a[i+1] += p1;    }else{t = a[i] % 10;p1 = a[i] / 10 % 10;p2 = a[i] / 100;a[i] = t;a[i+1] += p1;a[i+2] += p2;}i++;}
}int main(){while(1){char a[MAXSIZE], b[MAXSIZE]; //以字符串形式存放两个大数 int a_len,b_len;             //存放两个数的长度(不包括正负号) int minus = 0;  //0,2代表结果为正,1代表结果为负 int len; //决定result数组实际存放数据的长度(不包括正负号) cout<<"请输入两个数,用空格隔开:"<<endl;cin>>a>>b;a_len = strlen(a);b_len = strlen(b);len = a_len+b_len;if(a[0] == '-'){minus++;len--;} if(b[0] == '-'){minus++;len--;} result = new int(len+1); for(int i = 0; i <= len-1; i++){  //result数组全置为0 result[i] = 0;}result[len] = 10000;//给result数组多一位存放特殊数(大于四位数的都可以) if(a[0] == '-'&&b[0] == '-')Multipy(a,1,a_len-1,b,1,b_len-1,0);else if(a[0] == '-'&&b[0] != '-')Multipy(a,1,a_len-1,b,0,b_len-1,0);else if(a[0] != '-'&&b[0] != '-')Multipy(a,0,a_len-1,b,0,b_len-1,0);else Multipy(a,0,a_len-1,b,1,b_len-1,0);Arrange(result);int end = len-1;  while(result[end] == 0){  //结果数的前面的位数为0时,把它们省略end -= 1;   }if(minus == 1)cout<<'-';for(int i = end; i >= 0; i--){cout<<result[i];}if(end == -1)cout<<"0"; //这是结果为0的情况,以免没有输出cout<<endl; delete result;}
}

参考资料:
《算法学习与应用 从入门到精通》张玲玲
【算法】大数乘法问题及其高效算法
百度百科 大数运算
百度百科 karatsuba乘法
大数相乘(分治法, C/C++)

大数相乘(C语言,分治算法)相关推荐

  1. c语言分治算法之归并排序,分治算法之归并排序

    分治算法: 将一个规模为N的问题分解为K个规模较小的子问题,这些子问题互相独立且与原问题性质相同.求出子问题的解后进行合并,就可得到原问题的解. 一般步骤: 1.分解,将要解决的问题划分成若干规模较小 ...

  2. 高效大数乘法 c语言,华为2012校园招聘上机题——大数相乘,两个超过100位的大数相乘C语言...

    这是我调试时间最长的程序,整整弄了两天才弄好,不过还有点数组下标越界的小问题没解决!但是结果是正确的! 算法思想:将两个相乘的数分别放在两个数组中,之后用一个数,逐位的乘以另一个数,在将乘积的和放在另 ...

  3. C语言分治算法求中位数,【算法复习】分治算法

    Outline 分治思想和递归表达式 大整数乘法 矩阵乘法的Strassen算法 快速傅里叶变化 基于分治的排序 merge-sort排序 快速排序 排序的下界问题 中位数和顺序统计量 最邻近点对 凸 ...

  4. c语言分治算法求最大值,分治法找最大值(C語言)

    根據分治思路找最大值: #include int max(int a,int b){ if (a >= b) return a; else return b; } int find_max(in ...

  5. php大数相乘,简单的大数相乘算法

    大数相乘最直接的算法就是模拟小学学到的竖式乘法,可以使用数组或者字符串来存储乘数和被乘数,php代码实现如下: /** * 大数相乘代码 */ function multiply($str1,$str ...

  6. 第十章分治算法(大数相乘)

    分治算法:分治算法由两部分组成,分和治,分是使问题规模变小,递归解决较小的问题,治是从子问题的解中构建原问题的解. 传统上,在正文中至少含有两个递归调用的例程叫做分治算法,而正文中只含有一个递归调用的 ...

  7. c语言中大数相乘的方法,C++实现大数相乘算法

    本文实例为大家分享了C++实现大数相乘的具体代码,供大家参考,具体内容如下 首先说一下乘法计算的算法:同样是模拟人工计算时的方法. 从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘 ...

  8. 面试官让你用C语言实现大数相乘,慌吗?

    在之前的笔试题解析里面,我写了大数相加的问题,这里再剖析一个大数相乘,顾名思义,大数相乘就是这个数已经大到最大的数据类型都没有办法保存了. 我们看看最大的数据类型可以保存多大的数据. #include ...

  9. C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...

最新文章

  1. 采用编码器-解码器匹配语义分割的图像压缩
  2. EOS/普元:中国IT业的悲哀
  3. spark 在启动的时候出现JAVA_HOME not set
  4. poj 3660(Floyd求传递闭包)
  5. 中兴存储服务器 操作系统,中兴新支点服务器操作系统:企业级的国内服务器操作系统...
  6. idea 搜索不到gsonformat_Idea中GsonFormat插件安装
  7. 计算机网络读书笔记(1)
  8. 对接阿里云天气,获取天气预报数据
  9. 视频下载v1.0全能短视频解析
  10. linux篇—Nginx反向代理负载均衡
  11. tibco rv java实例_java – 我不允许使用Tibco Rendezvous确认消息的任何原因?
  12. 最新蹭网录制教程,pin破解,wpa破解
  13. 海尔简爱s11怎么进入bios_海尔简爱S11笔记本安装win10系统操作方法
  14. Python安装pip时, 报错:zipimport.ZipImportError: can‘t decompress data; zlib not available 解决办法:
  15. 撒罗满:2019年收集的最佳3D打印模型下载网站
  16. 在中国,混哪个“圈子”最有“钱”途?
  17. 树的基本概念和遍历规则 数据结构和算法 二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)
  18. Gurobi 解运输问题 python
  19. 怀念Macromedia
  20. 今天给同学们上课的感受

热门文章

  1. ios apple企业账号申请流程
  2. 系统重温Pandas笔记:(七)缺失数据
  3. paddlepaddle使用笔记——使用自己的数据训练ocr模型
  4. 用Python 制作微信全家福,这么神奇的吗?
  5. DataGridView单元格中播放gif动画的变通方法(转自:博客园蜡人张)
  6. 计算机教室标语6个字,班级有趣标语教室标语
  7. 关于计算机的论文 word,计算机网络专业论文(word文档)
  8. 使用python模拟飞秋,网络助手发消息及自动回复简易制作
  9. 在墙表面创建开关插座
  10. html5 仿手机聊天,HTML5仿手机微信聊天界面