- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
02大数阶乘——算法分析
大数阶乘——算法分析程序设计 算法设计 方案一:链表A x 链表n = 链表C 链表A = 链表C 方案二:链表A x int n = 链表B 链表A = 链表B 方案三:链表A x int n = 链表A 乘法计算 880 3 362 X 10 9!= 8 3 8800 800 3628 628 800 3 628 cinn n2 把n装入链表A n=n-1作为乘数 A=A*n Y N 输出A 删除链表 程序结束 结点:node 数据域:node-data 指针域:node-link 头指针:first 工作指针:pt 进位变量:int carry=0 pt=first pt-data=pt-data*n+carry carry=pt-data/1000 pt-data=pt-data%1000 pt-link!=0 Y N pt=pt-link Carry!=0 Y N pt-link=new node pt-link-link=NULL pt=pt-link pt-data=carry%1000 carry=carry/1000 880 362 pt pt 0 carry 8 3 8800 800 3628 628 pt 3 cinn n2 把n装入链表A n=n-1作为乘数 A=A*n Y N 输出A 删除链表 程序结束 结点:node 数据域:node-data 指针域:node-link 头指针:first 工作指针:pt 进位变量:int carry=0 pt=first coutpt-data pt-data10 Y N pt=pt-link pt-data100 Y N cout‘00’ cout‘0’ coutpt-data pt-link!=0 Y N 效率分析 //乘法实现 int carry=0; do{ ptA=ptAstart; do { carry=ptA-num*n+carry; ptA-num=carry%1000; carry=carry/1000; if(ptA-prior!=NULL) ptA=ptA-prior; else break; }while(1); while(carry){ ptA-prior=new node; ptA-prior-next =ptA; ptA-prior-prior =NULL; ptA=ptA-prior; ptAhead=ptA; ptA-num=carry%1000; carry=carry/1000; }; ptA=ptAstart; n--; }while(n2); 效率分析 carry=ptA-num*n+carry; mov eax,dword ptr [ptA] mov ecx,dword ptr [eax] imul ecx,dword ptr [n] add ecx,dword ptr [carry] mov dword ptr [carry],ecx ptA-num=carry%1000; mov eax,dword ptr [carry] cdq mov ecx,3E8h idiv eax,ecx mov eax,dword ptr [ptA] mov dword ptr [eax],edx carry=carry/1000; mov eax,dword ptr [carry] cdq mov ecx,3E8h idiv eax,ecx mov dword ptr [carry],eax __asm { mov ebx,ptA; mov ebx,[ebx]; mov eax,n; mul ebx; mov ecx,carry; lea eax,[eax+ecx]; mov ecx,1000; div ecx; mov carry,eax; mov eax,ptA; mov [eax],edx; } 总结 利用链表存储大数,适当增大结点位数可提高效率 如果用单链表,需在输出前原地逆置 * 因为考虑到时间效率,100000+!的计算没有意义,所以乘数可以直接用int型。方案三减少了每次的建表和删表 * 模拟竖式乘法 * 总流程图 * 一种输出方式 * 标注部分位于两层循环内,是程序调用最多的语句 * 蓝色是读取存储变量carr
文档评论(0)