全精度乘法

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

乘法基本流程:

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值