团队基础培训的小玩意儿。
乘法基本流程:
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>