POJ2389: 大数字乘法算法

2014-12-26

大数字乘法算法一般是采用模拟"小学生乘法演算过程”方法。

主要算法思想:

  1. 乘数a第i)位与乘数b第j)位数字相乘,并将该乘积结果放到乘积结果数组product的第(i+j-1)位中;

  2. 检查product的第(i+j-1)位中储存的数字是否超过或等于10,若是,则“取余并且进位”。

细节参考代码:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 void solve(string a,string b){
 5     int a_length=a.length();
 6     int b_length=b.length();
 7     int *arr_a=new int[a_length+1];
 8     int *arr_b=new int[b_length+1];
 9
10     for(int i=1;i<=a_length;i++){
11         arr_a[i] = a[i-1]-‘0‘;
12     }
13     for(int i=1;i<=b_length;i++){
14         arr_b[i] = b[i-1]-‘0‘;
15     }
16
17     int *product=new int[a_length+b_length];
18     int product_length = a_length+b_length-1;
19     for(int i=0;i<=product_length;i++) product[i]=0;
20
21      for(int i=a_length;i>=1;i--){
22
23          for(int j=b_length;j>=1;j--){
24              int temp = arr_a[i]*arr_b[j];
25              int c = product[i+j-1]+temp;
26              product[i+j-1] = c%10;
27              product[i+j-2] += c/10;
28          }
29      }
30
31
32     if(product[0]!=0) cout<<product[0];
33     for(int i=1;i<=product_length;i++){
34         cout<<product[i];
35     }cout<<endl;
36 }
37 int main(){
38     string a,b;
39     while(cin>>a>>b){
40         solve(a,b);
41     }
42     return 0;
43 }

时间: 2024-08-14 09:50:31

POJ2389: 大数字乘法算法的相关文章

题目:大整数乘法、除法,楼梯走法,数组中不同数字,超过一半数字(好)

大整数乘法,可以用单个数字想乘,跟踪进位信息来处理. 大整数除法,可以先把除数增大到跟被除数相同的量级,然后累计相减.比如 555 / 3,就先把3增大到300,555能够减1次,那么结果+100,被除数变成255,依次进行. 楼梯走法:一次走一级,或者走两级.没什么难度. 数组中不同数字:如果是2n+1数组找出不同的那个数字,用异或就可以. 如果是找出超出一般数目的数字,用遍历,看到不一样的,就一起删除,这样的方式. 上网搜了一下,找出了更好的方法: 用变量记录备选数字,一个计数器记录该数字剩

分治法解大整数乘法

在某些情况下,需要处理很大的整数,它无法在计算机中精确的表述和处理.若要精确的表示大整数,就必须使用软件的方法来实现大整数的运算.最常用的解决大整数运算的方法是使用一个二重循环,其算法时间复杂度为O(m*n)(其中m,n分别为两个大整数的长度):而选用分治方法则可以将算法时间复杂度降到O(n^(log3))(两个大整数的长度同为n).但分治方法的算法实现较为复杂,针对这个问题,本文借助标准C++实现了分治方法求解大整数乘法的算法. 下面分别介绍两种算法原理,及其实现: 1.使用二重循环控制两个数

使用快速傅里叶变换计算大整数乘法

我们知道,两个 N 位数字的整数的乘法,如果使用常规的算法,时间复杂度是 O(N2).然而,使用快速傅里叶变换,时间复杂度可以降低到 O(N logN loglogN). 假设我们要计算以下两个 N 位数字的乘积: a = (aN-1aN-2...a1a0)10 = aN-1x10N-1 + aN-2x10N-2 + ... + a1x101 + a0x100 b = (bN-1bN-2...b1b0)10 = bN-1x10N-1 + bN-2x10N-2 + ... + b1x101 + b

大整数乘法python3实现

由于python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,但是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位置开始算的.代码如下: import sys def list2str(li): while li[0]==0: del li[0] res='' for i in li: res+=str(i) return res def multi(stra,strb): aa=list(stra) bb=l

大整数乘法问题

数组可以实现的算法很多,典型应用就是大整数相乘问题.利用的思想非常巧妙,感觉和链表实现多项式运算有异曲同工,大整数相乘主要避免计算机存储精度不够的时候.按照基本的乘法运算实现即可! 主要注意返回指针类型,和关键点k=i的技巧. /*! * \file 算法之美--大整数乘法问题.cpp * * \author ranjiewen * \date 2016/12/04 15:58 * * */ #include <iostream> using namespace std; #define SI

九大基础排序算法总结

九大基础排序算法小结 一直想做份总结,总是抽不出时间,趁着周末闲着直接用了一整天做一份,一些内容参考了网上的一些博主的总结,还有网络上的一些图片. 好了,接下来就看看内容吧! 排序算法: 排序方法 时间复杂度 空间复杂度 稳定性 选用情况 平均情况 最坏情况 最好情况 Insertion Sort O(n^2) O(n^2) O(n) O(1) 稳定 n较小时 Selection Sort O(n^2) O(n^2) O(n^2) O(1) 不稳定 n较小时 Bubble Sort O(n^2)

不同的乘法算法

总结几种乘法算法: 传统乘法算法(九九乘法表) 英国式算法 与中国的传统算法类似,英国乘法算法前位向后位依次相乘,最后相加:传统算法从低位向高位取乘积,然后相加 俄罗斯式算法 原理是将数字拆分为1*X+1*M+1*N······的形式 分治法 拆分数字变为uv*xy的形式,记录进位,最后相加

数字三角形算法

题目描述 显示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. 每一步可沿左斜线向下或右斜 线向下走:1<三角形行数<25:三角形中的数字为整数<1000: 输入 第一行为N,表示有N行后面N行表示三角形每条路的路径权. 输出 路经所过的数字总和的最大的答案. 样例输入 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 样例输出 30 易错点:首先要读懂题意,题目要的是从左向下或者是从右向下:实际图形是这样的 7 3 8 8

十大基础实用算法之寻找最小(最大)的k个数-线性查找算法

例如:输入1,2,3,4,5,6,7,8这8个数字,则最小的4个数字为1,2,3,4. 思路1:最容易想到的方法:先对这个序列从小到大排序,然后输出前面的最小的k个数即可.如果选择快速排序法来进行排序,则时间复杂度:O(n*logn) 注:针对不同问题我们应该给出不同的思路,如果在应用中这个问题的规模不大,或者求解前k个元素的频率很高,或者k是不固定的.那么我们花费较多的时间对问题排序,在以后是使用中可以线性时间找到问题的解,总体来说,那么思路一的解法是最优的. 思路2:在思路1的基础上更进一步