不同的乘法算法

来源:http://www.youlihuishou.com 作者:杏彩平台注册网址-操作系统 人气:142 发布时间:2020-01-06
摘要:;布斯算法示例 ;一位相乘 ;=============ONEPROBLEM============ assume cs:code 前面介绍了大整数的加减法,这次是大整数的乘法。同样是模拟竖式计算,但乘法运算需要克服一些技巧上的障碍:首

;布斯算法示例
;一位相乘
;=============ONEPROBLEM============
assume cs:code

前面介绍了大整数的加减法,这次是大整数的乘法。同样是模拟竖式计算,但乘法运算需要克服一些技巧上的障碍:首先需要循环嵌套循环,然后通过一个数组实现逐位累加,最后统一完成进位工作。

总结几种乘法算法:

code segment
start:
 mov bl,2 ;被乘数
 mov al,-3 ;乘数,返回值也在al中
 mov cl,4 ;先把被乘数移到高位,方便加减
 shl bl,cl
杏彩平台注册网址, and al,0fh ;初始化乘数

C语言完整程序:

  • 传统乘法算法(九九乘法表)

 mov dh,al
 shl dh,1 ;先添加一个辅助位0
 mov dl,dh
 and dl,3 ;先判断辅助位和第一位.
 call panduan

#include

 mov cx,3
begin:
 shr dh,1
 mov dl,dh
 and dl,3
 call panduan
 loop begin

#include

  • 英国式算法

 mov ax,4c00h
 int 21h
panduan:
 cmp dl,0
 je yiwei
 cmp dl,3
 je yiwei
 cmp dl,1
 je jiafa
 cmp dl,2
 je jianfa

char a[100],b[100];

                与中国的传统算法类似,英国乘法算法前位向后位依次相乘,最后相加;传统算法从低位向高位取乘积,然后相加

yiwei:   ;00 或11 时,仅移位
 sar al,1
 ret
jiafa:   ;01 时,先相加,再移位
 add al,bl
 sar al,1
 ret
jianfa:   ;10 时,先相减,再移位
 sub al,bl
 sar al,1
 ret
code ends
end start

int c[100],d[100],e[100];

  • 俄罗斯式算法

main()

                原理是将数字拆分为1*X+1*M+1*N······的形式

{

  • 分治法

         int m,n,i,j;

                拆分数字变为uv*xy的形式,记录进位,最后相加

         scanf("%s %s",a,b);

 

         m=strlen(a);

         n=strlen(b);

         for(i=0;i<=m-1;i++)

         c[i]=a[m-1-i]-'0';

         for(i=0;i<=n-1;i++)

         d[i]=b[n-1-i]-'0';

    for(i=0;i<=n-1;i++)

    for(j=0;j<=m-1;j++)

    {

             e[i+j]+=c[i]*d[j];

         }

         for(i=0;i<=99;i++)

         {

                   e[i+1]+=e[i]/10;

                   e[i]%=10;

         }

         for(i=99;i>=0;i--)

         {

                   if(e[i]!=0)

                   {j=i;break;}

    }

    for(i=j;i>=0;i--)

    printf("%d",e[i]);

}

本文由杏彩彩票app发布于杏彩平台注册网址-操作系统,转载请注明出处:不同的乘法算法

关键词:

上一篇:VB编写简单的记事本(模仿Windows)

下一篇:没有了

最火资讯