全精度乘法

    xiaoxiao2023-11-02  178

    团队基础培训的小玩意儿。

    乘法基本流程:

    1.移小数点变整数

    2.竖式乘法

    3.结果累加

    4.恢复小数位

     

    只是测试演示代码,没有过多注意性能问题,下述代码计算示例执行13秒,预计做以下优化可以提升至1少以内,大抵满足绝大部分应用场景的时间复杂度要求(未试),有兴趣的可以改进一下:

    1.运算中的中间结果使用数组来存放

    2.在1的基础上可以依据64位系统的完整整数乘法和加法支持的最高位数分组计算和存放(进位稍复杂)

    3.在计算中使用速算法

    4.在二进制层面进行位移乘法

     

    另:

    上面那一小段代码  wimg,是练习循环和变量控制的,输入缕空正方形中缕空菱形中缕空正方形

    addnum实际上就是一个全精度加法函数了,只是只支持整型,可以适当加以改造支持小数

    算法没有考虑正负数(其实很简单,加法转换一下就可以,乘法只需要考虑一下数值符号即可)

    <style> body{ line-height:7px; } .abc { line-height:20px; } </style> <script> function op(){ document.write("*"); } function opw(){ document.write("<font color='white'>*</font>"); } function wimg(size){ var i,j,k; var ll,lr;//记录菱形左右边界,用以约束里面小正方形不要超出菱形范围 var m=Math.ceil(size/2); var m2=Math.ceil(m/2); for(i=1;i<=size;i++){ ll=0; lr=size; for (j=1;j<=size;j++){ if (i==1 || i==size){ op(); }else{ if (j==1 || j==size){ op(); }else{ //输出菱形 if ( m>i?(m-i+1 == (j<m?j:m-j+m)):(i-m+1 == (j<m?j:m-j+m)) ){// Math.abs(j-m+1)) { op(); if (ll==0) ll=(m>j?j:ll);//记录菱形边界 if (lr==size) lr=(m>j?lr:j); }else{ if (i>=m2 && i<=size-m2+1 && (ll>0 || i==m)){ //输出正方形 if (j>=ll && j<=lr){ if (i==m2 || i==size-m2+1){//输出正方形上下边 op(); }else if (j==m2 || j==size-m2+1){//输出正方形左右边 op(); }else{ opw(); } }else{ opw(); } }else{ opw(); } } } } } document.write("<br>"); } } wimg(35); //去0补0 function zeroproc(a,len,flag){ if (flag){ //去0 return a.replace(/^(0)*/,""); }else{ //补0 var s=""; for(i=0;i<len-a.length;i++){ s+="0"; } return s+a; } } //多数乘个数 function multione(a,b){ var i,j,rc,tmp; rc="0"; for(i=a.length-1;i>=0;i--){ tmp=a[i]*b; rc=(rc[0]-0+tmp>9?"":"0")+(rc[0]-0+tmp)+""+rc.substr(1); } return rc; } //接装结果,做加法 function addrlt(a){ var i,j,k; var rlt="0"; for(i=0;i<a.length;i++){ rlt=addnum(rlt,a[i]); } return rlt; } //两数相加 function addnum(a,b){ var rc,tmp; rc="0"; if (a.length>b.length){//交换,减少循环 tmp=a; a=b; b=tmp; } a=zeroproc(a,b.length,false); for(i=a.length-1;i>=0;i--){ tmp=(a.substr(i,1)-0)+(b.substr(i,1)-0); rc=(rc.substr(0,1)-0+tmp>9?"":"0")+(rc.substr(0,1)-0+tmp)+""+rc.substr(1); } return rc; } function multi(a,b,sflag){ var stime=new Date().getTime(); var nsl=0;//记录总小数位 var aa,bb,tmp; var i,j,k; var r=new Array();//中间结果 var rm; var rlt="";//结果 i=j=k=0; //换成整数 i=a.indexOf("."); if (i>0){ nsl=a.length-i-1; aa=a.replace(".",""); } i=b.indexOf("."); if (i>0){ nsl+=b.length-i-1; bb=b.replace(".",""); } //乘 if (aa.length<bb.length){//交换,减少循环 tmp=aa; aa=bb; bb=tmp; } tmp=""; //计算每一行结果 for(k=bb.length-1;k>=0;k--){ rm=multione(aa,bb[k]); r.push(rm+tmp); tmp+="0"; } //console.log(r); //结果拼装 rlt=addrlt(r); //结果处理,加上小数位,去0补0 //console.log(rlt); rlt=zeroproc(rlt,0,true); //console.log(rlt); if (rlt.length>nsl){ rlt=rlt.substr(0,rlt.length-nsl)+"."+rlt.substr(rlt.length-nsl); }else{ rlt="0."+zeroproc(rlt,nsl,false); } var etime=new Date().getTime(); document.write("开始时间:"+stime+" ~ 结束时间:"+etime +" ~ 总耗时:"+ (etime-stime)/1000 +"秒 <br>"); return (sflag?a+" * "+b+"=<br>":"")+rlt; } document.write("<div class='abc'>"); document.write(multi("268975496984345684685465454969843456846854654549698434568468546545496985465454969843456846854645684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545449698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465455.2222","222695246876549698434568468546545496984345684685465454969843456846854665456698434568468546545496984385465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546545496984345684685465454969843456846854654549698434568468546548564698794546.2278454548",true)); document.write("</div>"); </script>

     

    最新回复(0)