大整数乘法分而治之递归实现
来源:互联网 发布:opencv经典书籍知乎 编辑:程序博客网 时间:2024/05/22 15:20
在上算法课时,王晓东版的在大整数乘法那一章并没有给出具体的程序,在网上搜索大体上也是基于笔算而写出的算法,所以基于此我自己编写了一个基于递归实现的算法和大家交流下,当输入数据太大时,程序也会死掉,求解。
源代码,编译成.cpp文件即可运行。
===========================================
#include<stdio.h>#include<string.h>#include<math.h>void display(int num[]) //大整数输出{ int i=num[0]; while(0==num[i]) i--; for(;i>=1;i--) printf("%d",num[i]);}void align(int *num1,int *num2) //对大整数进行对阶,方便处理{/* if(num1[0]>=num2[0]) { if(num1[0]%2==0) { for(int i=num2[0]+1;i<=num1[0];i++) num2[i]=0; num2[0]=num1[0]; } else { num1[0]+=1; num1[num1[0]]=0; for(int i=num2[0]+1;i<=num1[0];i++) num2[i]=0; num2[0]=num1[0]; } } else { if(num2[0]%2==0) { for(int i=num1[0]+1;i<=num2[0];i++) num1[i]=0; num1[0]=num2[0]; } else { num2[0]+=1; num2[num2[0]]=0; for(int i=num1[0]+1;i<=num2[0];i++) num1[i]=0; num1[0]=num2[0]; } }*/ int ol,max; ol=0; max=num1[0]; if(num2[0]>max) max=num2[0]; while(pow(2,ol)<max) ol++; max=(int)pow(2,ol); for(int i=num1[0]+1;i<=max;i++) num1[i]=0; for(i=num2[0]+1;i<=max;i++) num2[i]=0; num1[0]=max; num2[0]=max; printf("max=%d\n",max);}void fun1(char *c,int *num) //处理字符串{ int i; num[0]=strlen(c); //a[0]存储数的位数 for(i=0;i<num[0];i++) { num[num[0]-i]=c[i]-'0'; }}void add(int num1[],int num2[],int num[]) //两个大整数相加{ int i; if(num1[0]>=num2[0]) { num[0]=num1[0]; for(i=1;i<=num2[0];i++) { num[i]=num1[i]+num2[i]; } for(;i<=num[0];i++) { num[i]=num1[i]; } for(i=1;i<=num[0];i++) { if(num[i]>=10) { num[i+1]+=num[i]/10; num[i]%=10; } } } else { num[0]=num2[0]; for(i=1;i<=num1[0];i++) { num[i]=num1[i]+num2[i]; } for(;i<=num[0];i++) { num[i]=num2[i]; } for(i=1;i<=num[0];i++) { if(num[i]>=10) { num[i+1]+=num[i]/10; num[i]%=10; } } }}void addfun(int *num1,int *num2,int *num3,int *num4,int *num) //四个大整数相加{ int temp1[1000],temp2[1000]; add(num1,num2,temp1); add(num3,num4,temp2); add(temp1,temp2,num);}void getRight(int *num,int *a,int n) //获得num右边的n位赋给a{ a[0]=n; for(int i=1;i<=n;i++) a[i]=num[i];}void getLeft(int *num,int *a,int n) //获得num左边的n位赋给a{ a[0]=n; for(int i=1;i<=n;i++) a[i]=num[i+n];}int *moveR(int *num,int n) //十进制大数右移n位{ for(int i=1;i<=n;i++) { for(int j=num[0];j>=1;j--) num[j+1]=num[j]; num[i]=0; num[0]++; } return num;}int *mult(int num1[],int num2[],int n) //大整数乘法{ int *num=new int(2*(n+1)); int a[1000],b[1000],c[1000],d[1000]; if(n==1) { num[n]=num1[n]*num2[n]; num[0]=2; num[2]=0; if(num[1]>=10) { num[2]=num[1]/10; num[1]%=10; } return num; } else { getLeft(num1,a,n/2); getRight(num1,b,n/2); getLeft(num2,c,n/2); getRight(num2,d,n/2); addfun(moveR(mult(a,c,n/2),n),moveR(mult(a,d,n/2),n/2),moveR(mult(b,c,n/2),n/2),mult(b,d,n/2),num); return num; }}void main() //主函数{ char a[1000],b[1000]; int num1[1000],num2[1000]; int *num=new int[1000]; printf("num1 = "); scanf("%s",a); printf("\n"); printf("num2 = "); scanf("%s",b); printf("\n"); fun1(a,num1); fun1(b,num2); align(num1,num2); num=mult(num1,num2,num1[0]); display(num1); printf(" * "); display(num2); printf(" = "); display(num); printf("\n");}
- 大整数乘法分而治之递归实现
- 递归分治-大整数乘法
- 大整数乘法实现
- C++实现大整数乘法
- 大整数乘法python3实现
- 大整数乘法C++实现
- 大整数乘法-数组实现
- 大整数乘法 java实现
- 整数乘法---FFT 的递归实现
- 大整数乘法的一种实现~~~
- 大整数乘法(C语言实现)
- 分治法实现大整数乘法
- 分治法实现大整数乘法
- 大整数乘法算法简单实现 java
- 大整数乘法-C语言实现
- 大整数乘法的Karatsuba算法实现
- python实现大整数相乘---格子乘法
- 算法实现(5)大整数乘法
- JMVC配置文件
- pic的第一个测试程序
- Unable to resolve target 'android-2'的问题解决
- oracle查看当前时间
- Linux下安装OpenWebMail
- 大整数乘法分而治之递归实现
- 关于Info.plist中你不得不知道的一点
- 清除 MySQL 二进制日志
- Java笔试题:override和overload的区别
- 如何执行SQL语句(C#)
- 奖金计算
- 拓展框问题
- Application does not specify an API level requirement!错误
- 【*】第三题:保龄球(提高组第二试2011年10月22日)(2011年NOIP冲刺模拟试题)