- 注册时间
- 2011-7-7
- 最后登录
- 2011-12-23
- 阅读权限
- 100
- 积分
- 271
- 精华
- 1
- 帖子
- 73
  
|
发表于 2011-7-14 11:48:36
|显示全部楼层
长实数乘法计算,一个无聊的暑假用于消遣的东西。介绍和所有debug的过程都在里面,就不多做解释了。现在帖给大家看看。- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML><HEAD>
- <TITLE>长实数乘法计算</TITLE>
- <META http-equiv="Content-Type" content="text/html; charset=gb2312">
- <SCRIPT language="JavaScript">
- <!--
- /*============简要说明==========
- 平常使用的笔算乘法:
- 111111
- X 1111111
- _____________
- 111111 1
- 111111 2
- 111111 3
- 111111 4
- 111111 5
- 111111 6
- + 111111 7
- _____________
- 123456654321
- 本脚本计算方式如下:
- 1 11111 (按五个数为一组来分组)
- X 11 11111
- ______________
- 123454321 (retVal[0])
- 11111 (retVal[1])
- 122221 (retVal[1]) (retVal[1]合计为133332)
- 11 (retVal[2])
- 即:
- 1234 54321 (再分组)
- 1 33332
- 11
- ______________
- 12 34566 54321 (求和)
- =========21:31 2008-8-11======
- 长正整数乘法计算
- =========21:41 2008-8-28======
- 长实数乘法计算
- (在原来的基础上加上负数和小数的运算功能)
- 今天太无聊了,突然想起这个,就完善一下这个脚本
- ===========By Arliang=========
- */
- String.prototype.toArray = function(k) //分组函数,按k个数为一组分组
- {
- k = (!!k)?k:5;
- var m = this.length;
- var retVal = [];
- var i = 0;
- while(m>0)
- {
- m = m-k;
- //retVal[i] = parseInt(this.substring((m<0)?0:m,m+k)); //此句会导致"010"被当做八进制数的错误。纠正如下:
- retVal[i] = this.substring((m<0)?0:m,m + k);
- while(retVal[i].charAt(0) == "0" && retVal[i].length > 1) retVal[i] = retVal[i].substr(1,retVal[i].length);
- retVal[i]=parseInt(retVal[i]);
- //2008-8-28
- i++;
- }
- return retVal;
- }
- String.prototype.locOfPoint = function() //清除小数点后末尾的0,再计算小数点位置的函数
- {
- if(this.indexOf(".") < 0) return 0;
- var str = this;
- while(str.charAt(str.length - 1) == "0")
- {
- str = str.substr(0,str.length - 1);
- if(str.charAt(str.length) == ".") str = str.substr(0,str.length - 1);
- }
- return str.length - (str.lastIndexOf(".") > -1 ? str.lastIndexOf(".") : str.length) - 1;
- }
- function longMultiply(strA,strB) //乘法计算函数
- {
- var args = arguments; //arguments是函数的参数组成的数组
- var R = /-?(?:(0\.\d*)|([?:1-9]\d*\.\d+)|[?:1-9]\d*|0)/; //匹配实数的正则表达式
- if(!args[0].match(R)||!args[1].match(R)||args[0].match(R)[0] != args[0] || args[1].match(R)[0] != args[1]) return "请输入两个实数!";
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~先判断是否匹配(08.9.24)
- var signFlag = 1; //结果的正负符号(1为正,-1为负)
- var pointLoc = 0; //结果中小数点位置(从右往左数)
- for(var i = 0; i < args.length; i++)
- {
- signFlag *= ((args[i].indexOf("-")>-1)?-1:1);
- args[i] = args[i].replace("-",""); //删除字符串里面的负号
- if(args[i].indexOf(".")<0) continue; //如果没有小数点则进入下一循环
- while(args[i].charAt(args[i].length - 1) == "0")
- {
- args[i] = args[i].substr(0,args[i].length - 1);
- if(args[i].charAt(args[i].length) == ".") args[i] = args[i].substr(0,args[i].length - 1);
- }//清除小数点后末尾的0
- /*test:alert(args[i]);*/
- pointLoc += args[i].locOfPoint();
- args[i] = args[i].replace(/0\.0*/g,""); //删除“0.00000X”型前面的“0.00000”,这一句很重要,没有这句的话,前面的0会导致整个数被认为是个八进制数
- args[i] = args[i].split(".").join(""); //删除小数点
- //以上的操作会将0.000型替换成"",所以特加此检查(9.26)
- if(args[i]=="")args[i]="0";
- //args[i] = args[i].replace(/0*$/,"")
- //while(args[i][0] == 0) args[i] = args[i].substr(1,args[i].length); //删除首位的0
- /*test:alert(args[i]);*/
- }
- var K = 5; //数字分组,每组数字中的数字个数
- var arrA = args[0].toArray(K);
- var arrB = args[1].toArray(K);
- /*test:for(var i = 0; i < arrA.length; i++) alert("A["+i+"]:"+arrA[i]);*/
- /*test:for(var i = 0; i < arrB.length; i++) alert("B["+i+"]:"+arrB[i]);*/
- var lenA = arrA.length;
- var lenB = arrB.length;
- /*test:alert(lenA+"和"+lenB);*/
- if(lenA + lenB == 0)return 0;
- var retVal = new Array(lenA+lenB-1);
- for(var i = 0; i < retVal.length; i++)retVal[i] = 0; //对数组元素置零
- for(var i = 0;i < lenA; i++)
- for(var j = 0;j < lenB; j++)
- {
- retVal[i + j] += arrA[i] * arrB[j];
- }
- for(var i = 0;i < retVal.length - 1; i++)
- {
- retVal[i + 1] += Math.floor(retVal[i]/Math.pow(10,K)); //相当于传统竖式中的进位
- retVal[i] %= Math.pow(10,K);
- }
- /*
- retVal = retVal.reverse().join(""); //合并数组,注意要倒序
- //此句会导致200000 X 2 = 40的错误
- //纠正如下:
- */
- for(var t = "" + retVal[retVal.length - 1] , i = retVal.length - 2;i > -1; i--)
- {
- while(retVal[i].toString().length < K) retVal[i] = "0" + retVal[i];
- t = t + retVal[i] + "";
- }
- retVal = t;
- if(pointLoc)
- {
- if(pointLoc >= retVal.length)
- {
- while(retVal.length <= pointLoc) retVal = "0" + retVal;
- }
- /*test:alert(retVal);*/
- retVal = new String(retVal.substr(0,retVal.length - pointLoc) + "." + retVal.substr(retVal.length - pointLoc)); //插入小数点
- while(retVal.charAt(retVal.length - 1) == "0")
- {
- retVal = retVal.substr(0,retVal.length - 1);
- if(retVal.charAt(retVal.length) == ".") retVal = retVal.substr(0,retVal.length - 1);//清除小数点后末尾的0
- /*test:alert(retVal);*/
- }
- }
- if(retVal == 0)
- {
- retVal = 0;
- signFlag = 1;
- }
- return (signFlag > 0?"" : "-") + retVal;
- }
- window.onload=function()
- {
- var strA = ((Math.random()>0.5)?"-":"") + ("" + Math.random()).replace(/(0\.)(0*)/,"") + ("" + Math.random()).replace(/0\./,"");
- var strB = ((Math.random()>0.5)?"-":"") + ("" + Math.random()).replace(/(0\.)(0*)/,"") + ("" + Math.random()).replace(/0\./,"");
- document.getElementById('numX1').value = strA;
- document.getElementById('numY1').value = strB;
- document.getElementById('ans1').value = longMultiply(strA,strB);
- //上面是整数乘法
- //==============
- //下面是小数乘法
- strA = ((Math.random()>0.5)?"-":"") + ("" + Math.random()).replace(/(0\.)(0*)/,"") + ("" + Math.random());
- strB = ((Math.random()>0.5)?"-":"") + ("" + Math.random()).replace(/(0\.)(0*)/,"") + ("" + Math.random());
- document.getElementById('numX2').value = strA;
- document.getElementById('numY2').value = strB;
- document.getElementById('ans2').value = longMultiply(strA,strB);
- }
- //-->
- </SCRIPT>
- </HEAD>
- <BODY>
- <CENTER>
- <INPUT type="text" id="numX1" size="34"> × <INPUT type="text" id="numY1" size="34">
- <INPUT type=button value=" = " onclick="document.getElementById('ans1').value=longMultiply(document.getElementById('numX1').value,document.getElementById('numY1').value);">
- <BR>
- <TEXTAREA id="ans1" rows="10" cols="78" readonly="true"></TEXTAREA>
- <BR>上面是整数乘法
- <BR>==============
- <BR>下面是小数乘法
- <BR>
- <INPUT type="text" id="numX2" size="34"> × <INPUT type="text" id="numY2" size="34">
- <INPUT type=button value=" = " onclick="document.getElementById('ans2').value=longMultiply(document.getElementById('numX2').value,document.getElementById('numY2').value);">
- <BR>
- <TEXTAREA id="ans2" rows="10" cols="78" readonly="true"></TEXTAREA>
- </CENTER>
- </BODY>
- </HTML>
复制代码 |
|