问题描述

求两个不超过200位的非负整数的积。
输入数据
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出要求
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。 
输入样例
12345678900
98765432100
输出样例
1219326311126352690000

解题思路

在下面的例子程序中,用unsigned an1[200]和unsigned an2[200]分别存放两个乘数,用aResult[400]来存放积。计算的中间结果也都存在aResult中。aResult长度取400是因为两个200位的数相乘,积最多会有400位。an1[0], an2[0], aResult[0]都表示个位。
计算的过程基本上和小学生列竖式做乘法相同。为编程方便,并不急于处理进位,而将进位问题留待最后统一处理。
现以 835×49为例来说明程序的计算过程。
先算835×9。5×9得到45个1,3×9得到27个10,8×9得到72个100。由于不急于处理进位,所以835×9算完后,aResult如下:
 
接下来算4×5。此处4×5的结果代表20个10,因此要 aResult[1]+=20,变为:
 

再下来算4×3。此处4×3的结果代表12个100,因此要 aResult[2]+= 12,变为:

最后算 4×8。此处4×8的结果代表 32个1000,因此要 aResult[3]+= 32,变为:

乘法过程完毕。接下来从 aResult[0]开始向高位逐位处理进位问题。aResult[0]留下5,把4加到aResult[1]上,aResult[1]变为51后,应留下1,把5加到aResult[2]上……最终使得aResult里的每个元素都是1位数,结果就算出来了:

总结一个规律,即一个数的第i位和另一个数的第j位相乘所得的数,一定是要累加到结果的第i+j位上。这里i, j都是从右往左,从0开始数。

参考程序:

#include <stdio.h>
#include <string.h>
#define MAX_LEN 200
unsigned an1[MAX_LEN+10];
unsigned an2[MAX_LEN+10];
unsigned aResult[MAX_LEN * 2 + 10];
char szLine1[MAX_LEN+10];
char szLine2[MAX_LEN+10];
int main()
{gets( szLine1); //gets函数读取一行gets( szLine2);int i, j;int nLen1 = strlen( szLine1);memset( an1, 0, sizeof(an1));memset( an2, 0, sizeof(an2));memset( aResult, 0, sizeof(aResult));  j = 0;for( i = nLen1 - 1;i >= 0 ; i --)an1[j++] = szLine1[i] - '0';int nLen2 = strlen(szLine2);j = 0;for( i = nLen2 - 1;i >= 0 ; i --)an2[j++] = szLine2[i] - '0';for( i = 0;i < nLen2; i ++ )     { //每一轮都用an1的一位,去和an2各位相乘//从an1的个位开始for( j = 0; j < nLen1; j ++ )  //用选定的an1的那一位,去乘an2的各位 aResult[i+j] += an2[i]*an1[j]; //两数第i, j位相乘,累加到结果的第i+j位}//下面的循环统一处理进位问题for( i = 0; i < MAX_LEN * 2; i ++ )   {if( aResult[i] >= 10 ) {aResult[i+1] += aResult[i] / 10;aResult[i] %= 10;}}//下面输出结果bool bStartOutput = false;for( i = MAX_LEN * 2; i >= 0; i -- )if( bStartOutput)printf("%d", aResult[i]);else if( aResult[i] ) {printf("%d", aResult[i]);bStartOutput = true;}if(! bStartOutput )printf("0");return 0;
}

实现技巧

不一定一出现进位就马上处理,而是等全部结果算完后再统一处理进位,有时会方便些。

算法总结——大整数乘法相关推荐

  1. 【分治算法】大整数乘法

    前言 最近开了算法导论课,上来就是递归分治,大整数乘法就是分治法的典型案例,通过参考网上书上我终于编程实现了大整数乘法,特此纪念 原理 由于两个大整数直接相乘太大,所以我们可以将它划分成几个小块分别相 ...

  2. 分治算法解决大整数乘法问题

    整数相乘:小整数相乘在算法时间分析中可以认为是常数时间,但是对于大整数,时间需要考虑.两个N位数的整数X和Y相乘,常规方法花费时间是,因为X的每一位都要和Y的每一位相乘,是两层循环. 分治算法解决整数 ...

  3. karatsuba算法(大整数乘法)

    Karatsuba算法 Karatsuba算法主要应用于两个大数的相乘,原理是将大数分成两段后变成较小的数位,然后做3次乘法,并附带少量的加法操作和移位操作. 可以将X,Y,分开来计算,同时对于AD+ ...

  4. python【数据结构与算法】分治算法之大整数乘法

    文章目录 1 概念 2 代码实现 1 概念 首先,普通的X*Y复杂度为O(n^2),这个复杂度是不理想的,所以利用分治思想提高. 如图所示,分成三个子问题后,利用Master定理,发现时间并没有提高. ...

  5. python两数相乘代码_Python 实现大整数乘法算法的示例代码

    我们平时接触的长乘法,按位相乘,是一种时间复杂度为 O(n ^ 2) 的算法.今天,我们来介绍一种时间复杂度为 O (n ^ log 3) 的大整数乘法(log 表示以 2 为底的对数). 介绍原理 ...

  6. 计算机算法设计与分析 大整数乘法

    大整数乘法 问题描述 求两个不超过200位的非负整数的积. 输入形式 有两行,每行是一个不超过200位的非负整数,没有多余的前导0. 输出形式 一行,即相乘后的结果.结果里不能有多余的前导0,即如果结 ...

  7. 大整数乘法(Karatsuba算法的字符串形式的C++实现)

    #include <iostream> #include <sstream> #include <cstring> using namespace std;/函数声 ...

  8. 分治法实验之大整数乘法(算法设计分析)

    分治法实验之大整数乘法 01. 问题描述 02. 输入格式 03. 输出格式 04. 输入样例 05. 输出样例 06. 问题分析 07. 算法设计 08. 代码实现 09. 测试结果 10. 复杂度 ...

  9. 【算法/C语言】大整数乘法(分治)

    题目: 用分治算法编程实现两个n位十进制大整数的乘法运算. 思路: 参考大整数乘法的详解 伪码: Function MulOfLargeInt(X,Y,n)** 输入:n位乘数X,Y,位数n 输出:X ...

最新文章

  1. C语言小知识:typedef\函数模板\
  2. 手把手教你搭建 ELK 实时日志分析平台
  3. 虚拟机拷贝出来_NETAPP存储虚拟机数据恢复案例
  4. linux-压缩和解压类
  5. div背景透明_为什么css3实现background-image和半透明边框这么麻烦
  6. REEM-C的安装与启动
  7. 调用别人服务器运行本地文件方法
  8. 二叉树的常用操作(节点的后继节点)
  9. python中绘制散点图的函数_如何使用python的pygame模块绘制随机散点图
  10. [Swift]LeetCode593. 有效的正方形 | Valid Square
  11. 设置导出目录oracle11g,Oracle11g不同目录的冷备份解决方案
  12. Django(四):模型层Model
  13. Day33:Swift 和 Object - C
  14. UKEY开发,vue+websocket实现用户登录UKEY认证
  15. html 图片滑动验证码,html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】...
  16. 基于JavaMail的Java邮件发送:简单邮件发送
  17. 设计c语言程序,输出形状为直角三角形的九九乘法表,c语言题库(全国c语言二级考试题库)...
  18. win10 双开微信实操
  19. 群赛 round#5 解题报告(superoxide,choice,rpwt)
  20. .net web 开发平台- 表单设计器 一(web版)

热门文章

  1. 使用UnblockNeteaseMusic播放网易云音乐客户端无版权歌曲
  2. Java类和对象的特征
  3. 软考中级【数据库系统工程师】第1章:计算机系统知识,自学软考笔记,备考2022年5月份软考,计算机硬件系统CPU组成指令寄存器组总线输入输出的程序控制方式计算机体系结构与存储系统加密技术流水线技术
  4. 基于Proteus的8×8LED点阵实验
  5. 【备份】git命令行
  6. HackTheBox::Doctor
  7. SimpleDateFormat的使用:SimpleDateFormat对日期Date类的格式化和解析
  8. ext2与ext3的区别
  9. STM32——快速识别芯片引脚数
  10. linux 下dump文件放在那里,怎么查看dump文件目录