版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include#include#include#include#define DATASIZE 1000/ 该函数用以接收用户输入的大整数,返回值为该大整数的数字位数int InputBigInt(int arr)char ch;int i=0;printf(Input a Big Interger:);while(1)scanf(%c,&ch);if(ch=n)break;elsearri+=ch-0;return i;/ 该函数通过在较短的大整数之前填充 0 的方式,将两个大整数的位数对 齐,返回值为较长的那个大整数的位置int AlignArray(int *a,int len_a,i
2、nt *b,int len_b)int len_align=len_a;if(len_alen_b)for(int i=len_b-1;i=0;i-) bi+(len_a-len_b)=bi;for(int i=0;ilen_a-len_b;i+)bi=0;len_align=len_a;else if(len_a=0;i-) ai+(len_b-len_a)=ai;for(int i=0;ilen_b-len_a;i+)ai=0;len_align=len_b;return len_align;/ 该函数通过删去大整数前面无意义的 0 来得到其真实的数字位数 int Adjust(int a
3、,int len)while(a0=0)int j=1;doaj-1=aj;j+;while(j=0;i-)int t=ai+bi+carry;ci+1=t%10;carry=t/10;c0=carry;return length+1;/ 两个长度为 length 的大整数做减法,得到的结果放到数组 C 中,长度为 lengthint Sub(int a,int b,int c,int length)int borrow=0;for(int i=length-1;i=0;i-)ai=ai-borrow;if(ai=bi)ci=ai-bi;borrow=0;elseint t=ai+10-bi;
4、borrow=1;return length;/ 分治法求两个大整数的乘积,它只需要更少次数的乘法,但是它必须递归int DividBigIntMultiply(int a,int b,int c,int len)int l=len/2;if(len=1)int t=a0*b0;c0=t/10;c1=t%10;return 2;elseif(len=2)int t1=a1*b1;c3=t1%10;int t2=a0*b1+a1*b0+t1/10;c2=t2%10;int t3=a0*b0+t2/10;c1=t3%10;c0=t3/10;return 4;5 / 10elseint *a1,*a
5、0,*b1,*b0;a1=(int *)malloc(l*sizeof(int);a0=(int *)malloc(len-l)*sizeof(int);b1=(int *)malloc(l*sizeof(int);b0=(int *)malloc(len-l)*sizeof(int);if(a1=NULL | a0=NULL | b1=NULL | b0=NULL)printf( 内存分配失败,递归失败,程序退出! n);exit(0);/将原来的两个大整数,分治为一半,分别放入到a1,aO和bl, b0四个数组当中去 for(int i=0;il;i+)a1i=ai;b1i=bi;for(
6、int i=l;ilen;i+)a0i-l=ai;b0i-l=bi;int l1=AlignArray(a1,l,a0,len-l);int l2=AlignArray(b1,l,b0,len-l);l=l1;/先求得c2和cO,直接做乘法就可以了int *c2,*c0;c2=(int *)malloc(2*l*sizeof(int);c0=(int *)malloc(2*l*sizeof(int);if(c2=NULL | c0=NULL)printf( 内存分配失败,递归失败,程序退出! n);exit(0);DividBigIntMultiply(a1,b1,c2,l);/c2=a1*b
7、1, 长度为 2*l DividBigIntMultiply(a0,b0,c0,l);/c0=a0*b0, 长度为 2*l/再来求得C1,这里有乘法也有加法,还有减法/c1=(a1+a0)*(b1+b0)-(c2+c0)int *t1,*t2,*t3,*t4,*C1;t1=(int *)malloC(1+l)*sizeof(int); /t1=a1+a0t2=(int *)malloC(1+l)*sizeof(int); /t2=b1+b0t3=(int *)malloC(1+2*l)*sizeof(int);/t3=t1*t2t4=(int *)malloC(2*(l+1)*sizeof(i
8、nt);/t4=C2+C0C1=(int *)malloC(2*(l+1)*sizeof(int);/C1=t3-t4 if(t1=NULL | t2=NULL | t3=NULL)printf( 内存分配失败,递归失败,程序退出! n); exit(0);int len 仁Add(a1,aO,t1,l); lit 仁 a1+aO,长度为 1+1int len2=Add(b1,b0,t2,l);/t2=b1+b0, 长度为 l+1int len4=Add(c2,c0,t4,2*l);llt4=c2+c0, 长度为 2*l+1int len3=AlignArray(t1,len1,t2,len2
9、);DividBigIntMultiply(t1,t2,t3,len3);llt3=t1*t2, 长度为 2*(l+1)int k=AlignArray(t4,len4,t3,len3);ll 将 c1 与 t3 对齐,长度为 2*(l+1)int len5=Sub(t4,t3,c1,k); llc1=t4-t3, 长度为 2*(l+1)ll 打印输出 c2,c1 和 c0int i=0;printf(c2=);while(c2i=0) i+;for(;i2*l;i+)printf(%d,c2i);printf(n);int j=0;printf(c0=);while(c0j=0) j+;for(;j2*l;j+)printf(%d,c0j);printf(n);int n=0;printf(c1=);while(c1n=0) n+;for(;nlen5;n+)printf(%d,c1n);printf(n);return 2*len;void main()int aDATASIZE,bDATASIZE,c2*DATASIZE;int len_a,len_b,len_align;len_a=InputBigInt(a);len_b=InputBigInt(b);/ 输入大整数 a/ 输入大整数 blen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 弹日式乐器用指套市场发展预测和趋势分析
- 医用胶带产业规划专项研究报告
- 铝板雨棚防水施工方案
- 智能制造大型机械运作方案
- 经典心理电影赏析学习通超星期末考试答案章节答案2024年
- 果蔬大棚立体种植施工方案
- 雨季房屋防水施工方案
- 断桥铝门窗项目预算方案
- 教研组长培训与考核方案
- 医用助听器械市场需求与消费特点分析
- 《1.6.1 余弦定理》说课稿
- 急诊医学测试试题及答案
- 2024年广州铁路(集团)公司招聘468人易考易错模拟试题(共500题)试卷后附参考答案
- 第四单元两、三位数除以一位数(单元测试)-2024-2025学年三年级上册数学苏教版
- 人教版一年级上册数学期末试题及答案
- 浙江省9+1高中联盟2023-2024学年高一上学期11月期中英语试题 含解析
- 2025届高三化学一轮复习 第13讲 铁盐、亚铁盐及其转化 课件
- 【电商企业跨国并购的绩效探析案例:以阿里巴巴并购Lazada为例(论文)14000字】
- 2023年11月软考中级系统集成项目管理工程师下午真题(第二批)
- 云南太阳能资源分析
- 2024智慧园区系统建设规范
评论
0/150
提交评论