第九区-Jquery超级群

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 260|回复: 2

长实数乘法计算 [复制链接]

Rank: 7Rank: 7Rank: 7

发表于 2011-7-14 11:48:36 |显示全部楼层
长实数乘法计算,一个无聊的暑假用于消遣的东西。介绍和所有debug的过程都在里面,就不多做解释了。现在帖给大家看看。
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML><HEAD>
  3. <TITLE>长实数乘法计算</TITLE>
  4. <META http-equiv="Content-Type" content="text/html; charset=gb2312">
  5. <SCRIPT language="JavaScript">
  6. <!--

  7. /*============简要说明==========

  8. 平常使用的笔算乘法:

  9.         111111
  10. X      1111111
  11. _____________
  12.         111111  1
  13.        111111   2
  14.       111111    3
  15.      111111     4
  16.     111111      5
  17.    111111       6
  18. + 111111        7
  19. _____________
  20.   123456654321


  21. 本脚本计算方式如下:
  22.        1 11111  (按五个数为一组来分组)
  23. X     11 11111
  24. ______________
  25.      123454321  (retVal[0])
  26.    11111        (retVal[1])
  27.   122221        (retVal[1])  (retVal[1]合计为133332)
  28. 11              (retVal[2])


  29. 即:
  30.     1234 54321  (再分组)
  31. 1 33332
  32. 11
  33. ______________
  34. 12 34566 54321  (求和)

  35.   =========21:31 2008-8-11======
  36.   长正整数乘法计算

  37.   =========21:41 2008-8-28======
  38.   长实数乘法计算
  39.   (在原来的基础上加上负数和小数的运算功能)
  40.   今天太无聊了,突然想起这个,就完善一下这个脚本

  41.   ===========By Arliang=========
  42. */

  43. String.prototype.toArray = function(k)  //分组函数,按k个数为一组分组
  44. {
  45.   k = (!!k)?k:5;
  46.   var m = this.length;
  47.   var retVal = [];
  48.   var i = 0;
  49.   while(m>0)
  50.   {
  51.     m = m-k;
  52.     //retVal[i] = parseInt(this.substring((m<0)?0:m,m+k));  //此句会导致"010"被当做八进制数的错误。纠正如下:
  53.     retVal[i] = this.substring((m<0)?0:m,m + k);
  54.     while(retVal[i].charAt(0) == "0" && retVal[i].length > 1) retVal[i] = retVal[i].substr(1,retVal[i].length);
  55.     retVal[i]=parseInt(retVal[i]);
  56.     //2008-8-28
  57.     i++;
  58.   }
  59.   return retVal;
  60. }

  61. String.prototype.locOfPoint = function()  //清除小数点后末尾的0,再计算小数点位置的函数
  62. {
  63.   if(this.indexOf(".") < 0) return 0;
  64.   var str = this;
  65.   while(str.charAt(str.length - 1) == "0")
  66.   {
  67.     str = str.substr(0,str.length - 1);
  68.     if(str.charAt(str.length) == ".") str = str.substr(0,str.length - 1);
  69.   }
  70.   return str.length - (str.lastIndexOf(".") > -1 ? str.lastIndexOf(".") : str.length) - 1;
  71. }

  72. function longMultiply(strA,strB)  //乘法计算函数
  73. {
  74.   var args = arguments;  //arguments是函数的参数组成的数组
  75.   var R = /-?(?:(0\.\d*)|([?:1-9]\d*\.\d+)|[?:1-9]\d*|0)/;  //匹配实数的正则表达式
  76.   if(!args[0].match(R)||!args[1].match(R)||args[0].match(R)[0] != args[0] || args[1].match(R)[0] != args[1]) return "请输入两个实数!";
  77.    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~先判断是否匹配(08.9.24)
  78.   var signFlag = 1;  //结果的正负符号(1为正,-1为负)
  79.   var pointLoc = 0;  //结果中小数点位置(从右往左数)

  80.   for(var i = 0; i < args.length; i++)
  81.   {
  82.     signFlag *= ((args[i].indexOf("-")>-1)?-1:1);
  83.     args[i] = args[i].replace("-","");  //删除字符串里面的负号

  84.     if(args[i].indexOf(".")<0) continue;  //如果没有小数点则进入下一循环
  85.     while(args[i].charAt(args[i].length - 1) == "0")
  86.     {
  87.       args[i] = args[i].substr(0,args[i].length - 1);
  88.       if(args[i].charAt(args[i].length) == ".") args[i] = args[i].substr(0,args[i].length - 1);
  89.     }//清除小数点后末尾的0
  90. /*test:alert(args[i]);*/
  91.     pointLoc += args[i].locOfPoint();
  92.     args[i] = args[i].replace(/0\.0*/g,"");  //删除“0.00000X”型前面的“0.00000”,这一句很重要,没有这句的话,前面的0会导致整个数被认为是个八进制数
  93.     args[i] = args[i].split(".").join("");  //删除小数点

  94.     //以上的操作会将0.000型替换成"",所以特加此检查(9.26)
  95.     if(args[i]=="")args[i]="0";

  96.     //args[i] = args[i].replace(/0*$/,"")

  97.     //while(args[i][0] == 0) args[i] = args[i].substr(1,args[i].length);  //删除首位的0
  98. /*test:alert(args[i]);*/
  99.   }

  100.   var K = 5;  //数字分组,每组数字中的数字个数
  101.   var arrA = args[0].toArray(K);
  102.   var arrB = args[1].toArray(K);
  103. /*test:for(var i = 0; i < arrA.length; i++) alert("A["+i+"]:"+arrA[i]);*/
  104. /*test:for(var i = 0; i < arrB.length; i++) alert("B["+i+"]:"+arrB[i]);*/
  105.   var lenA = arrA.length;
  106.   var lenB = arrB.length;
  107. /*test:alert(lenA+"和"+lenB);*/
  108.   if(lenA + lenB == 0)return 0;
  109.   var retVal = new Array(lenA+lenB-1);
  110.   for(var i = 0; i < retVal.length; i++)retVal[i] = 0;  //对数组元素置零

  111.   for(var i = 0;i < lenA; i++)
  112.     for(var j = 0;j < lenB; j++)
  113.     {
  114.       retVal[i + j] += arrA[i] * arrB[j];
  115.     }

  116.   for(var i = 0;i < retVal.length - 1; i++)
  117.   {
  118.     retVal[i + 1] += Math.floor(retVal[i]/Math.pow(10,K));  //相当于传统竖式中的进位
  119.     retVal[i] %= Math.pow(10,K);
  120.   }
  121. /*
  122.   retVal = retVal.reverse().join("");  //合并数组,注意要倒序
  123.   //此句会导致200000 X 2 = 40的错误
  124.   //纠正如下:
  125. */

  126.   for(var t = "" + retVal[retVal.length - 1] , i = retVal.length - 2;i > -1; i--)
  127.   {  
  128.     while(retVal[i].toString().length < K) retVal[i] = "0" + retVal[i];
  129.     t = t + retVal[i] + "";
  130.   }
  131.   retVal = t;

  132.   if(pointLoc)
  133.   {
  134.     if(pointLoc >= retVal.length)
  135.     {
  136.       while(retVal.length <= pointLoc) retVal = "0" + retVal;
  137.     }
  138. /*test:alert(retVal);*/
  139.     retVal = new String(retVal.substr(0,retVal.length - pointLoc) + "." + retVal.substr(retVal.length - pointLoc));  //插入小数点
  140.     while(retVal.charAt(retVal.length - 1) == "0")
  141.     {
  142.       retVal = retVal.substr(0,retVal.length - 1);
  143.       if(retVal.charAt(retVal.length) == ".") retVal = retVal.substr(0,retVal.length - 1);//清除小数点后末尾的0
  144. /*test:alert(retVal);*/
  145.     }
  146.   }
  147.   if(retVal == 0)
  148.   {
  149.     retVal = 0;
  150.     signFlag = 1;
  151.   }
  152.   return (signFlag > 0?"" : "-") + retVal;
  153. }

  154. window.onload=function()
  155. {
  156.   var strA = ((Math.random()>0.5)?"-":"") + ("" + Math.random()).replace(/(0\.)(0*)/,"") + ("" + Math.random()).replace(/0\./,"");
  157.   var strB = ((Math.random()>0.5)?"-":"") + ("" + Math.random()).replace(/(0\.)(0*)/,"") + ("" + Math.random()).replace(/0\./,"");
  158.   document.getElementById('numX1').value = strA;
  159.   document.getElementById('numY1').value = strB;
  160.   document.getElementById('ans1').value = longMultiply(strA,strB);
  161.   //上面是整数乘法
  162.   //==============
  163.   //下面是小数乘法
  164.   strA = ((Math.random()>0.5)?"-":"") + ("" + Math.random()).replace(/(0\.)(0*)/,"") + ("" + Math.random());
  165.   strB = ((Math.random()>0.5)?"-":"") + ("" + Math.random()).replace(/(0\.)(0*)/,"") + ("" + Math.random());
  166.   document.getElementById('numX2').value = strA;
  167.   document.getElementById('numY2').value = strB;
  168.   document.getElementById('ans2').value = longMultiply(strA,strB);
  169. }

  170. //-->
  171. </SCRIPT>
  172. </HEAD>
  173. <BODY>
  174. <CENTER>
  175. <INPUT type="text" id="numX1" size="34"> × <INPUT type="text" id="numY1" size="34">
  176. <INPUT type=button value=" = " onclick="document.getElementById('ans1').value=longMultiply(document.getElementById('numX1').value,document.getElementById('numY1').value);">
  177. <BR>
  178. <TEXTAREA id="ans1" rows="10" cols="78" readonly="true"></TEXTAREA>
  179. <BR>上面是整数乘法
  180. <BR>==============
  181. <BR>下面是小数乘法
  182. <BR>
  183. <INPUT type="text" id="numX2" size="34"> × <INPUT type="text" id="numY2" size="34">
  184. <INPUT type=button value=" = " onclick="document.getElementById('ans2').value=longMultiply(document.getElementById('numX2').value,document.getElementById('numY2').value);">
  185. <BR>
  186. <TEXTAREA id="ans2" rows="10" cols="78" readonly="true"></TEXTAREA>
  187. </CENTER>
  188. </BODY>
  189. </HTML>
复制代码
不积跬步无以至千里
不积小流无以成江海

阿良的小站

Rank: 7Rank: 7Rank: 7

发表于 2011-7-14 11:49:25 |显示全部楼层
先占沙发在看
别人笑我太淫荡 我笑他人不开放

使用道具 举报

Rank: 7Rank: 7Rank: 7

发表于 2011-7-14 11:50:18 |显示全部楼层
我顶你!下次贴贴复数的算法啊!嘿嘿

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|第九区-Jquery超级群    点击这里加入此群 点击这里加入此群

GMT+8, 2012-2-8 09:41 , Processed in 0.061861 second(s), 15 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部