zoukankan      html  css  js  c++  java
  • JS一个算法题

    题目:实现超出整数存储范围的两个大整数想加function(a,b)。注意:参数a和b以及函数返回值都是字符串。

    目的:考算法, 基本逻辑。

    我实现的基本思路是:

    ①两个数字字符串长度补成一样,用字符串'0’补位,比如 a='1111',b='22',b用'0'补位成='0022'.

    ②分3中情况处理,初始值的长度比较,,a的长度大于b的长度,b的长度大于a的长度,a的长度等于b的长度

    ③初始值的长度比较,,a的长度大于b的长度,补位比较简单,再用两个空数组push进去,push的时候都parseInt( )转换成数字,为后面好计算

    ④再准备个空数组,for循环 把③的两个数组里对应的索引值的值想加后的值push进这个空数组,标记数组④

    ⑤数组④里的值再用比较排序的原理再处理下,差不多就出来了,不废话了,直接上代码

     1 function add(a,b){
     2     var arr=[];
     3     var len=a.length>b.length?a.length:(a.length<b.length?b.length:a.length);
     4     var n=a.length>b.length?a.length-b.length:b.length-a.length;
     5     if(a.length===b.length){
     6         for(var i=0;i<len;i++){
     7             arr.unshift(parseInt(a[i])+parseInt(b[i]))    
     8         }    
     9     }else{
    10         var str='';
    11         for(var i=0;i<n;i++){
    12             str+='0';
    13         }
    14         var _this= a.length>b.length ? str+b : str+a ;
    15         if(a.length>b.length){
    16             for(var i=0;i<len;i++){
    17                 arr.unshift(parseInt(a[i])+parseInt(_this[i]))
    18             }
    19         }else{
    20             for(var i=0;i<len;i++){
    21                 arr.unshift(parseInt(b[i])+parseInt(_this[i]))
    22             }
    23         }
    24     }
    25     for(var i=0;i<len-1;i++){
    26         for(var j=0;j<len-1-i;j++){
    27             if(arr[j]>=10){
    28                 var temp=arr[j]-10;
    29                 arr[j]=temp;
    30                 arr[j+1]=arr[j+1]+1;
    31             }else{
    32                 arr[j]=arr[j];
    33             }
    34         }
    35     }
    36 
    37     return arr.reverse().join('');
    38 }
    39 
    40 var a='111';
    41 var b='22275676575'
    42 console.log(add(a,b))
    43 console.log(parseInt(a)+parseInt(b))
    再优化了下:
     1 function add(a,b){
     2     var arr=[];
     3     var len=a.length>b.length?a.length:(a.length<b.length?b.length:a.length);
     4     var n=a.length>b.length?a.length-b.length:b.length-a.length;
     5     if(a.length===b.length){
     6         for(var i=0;i<len;i++){
     7             arr.unshift(parseInt(a[i])+parseInt(b[i]))    
     8         }    
     9     }else{
    10         var _this= a.length>b.length ? b.padStart(len,'0') : a.padStart(len,'0') ;
    11         if(a.length>b.length){
    12             for(var i=0;i<len;i++){
    13                 arr.unshift(parseInt(a[i])+parseInt(_this[i]))
    14             }
    15         }else{
    16             for(var i=0;i<len;i++){
    17                 arr.unshift(parseInt(b[i])+parseInt(_this[i]))
    18             }
    19         }
    20     }
    21     for(var i=0;i<len-1;i++){
    22         for(var j=0;j<len-1-i;j++){
    23             if(arr[j]>=10){
    24                 var temp=arr[j]-10;
    25                 arr[j]=temp;
    26                 arr[j+1]=arr[j+1]+1;
    27             }else{
    28                 arr[j]=arr[j];
    29             }
    30         }
    31     }
    32     return arr.reverse().join('');
    33 }
    34 
    35 var a='111';
    36 var b='22275676575'
    37 console.log(add(a,b))
    38 console.log(parseInt(a)+parseInt(b))
     

     小数精度处理方法:超小值保存 需要保存成字符串

     1 function add(a,b){
     2   var aStr=a.toString();
     3   var bStr=b.toString();
     4   var aLen=aStr.length;
     5   var bLen=bStr.length;
     6   var resStr=aLen>bLen?aStr:bStr;
     7   var resLen=aLen>bLen?aLen:bLen;
     8   var n= resLen - resStr.indexOf('.')-1;
     9   return (a*10*n+b*10*n)/(10*n)
    10 }
    11 console.log(add(0.1,0.2))//0.3
    12 console.log(add(0.1,0.00000002))//0.10000002
    13 console.log(add(0.01,0.0000002))//0.0100002
  • 相关阅读:
    【Android】利用服务Service创建标题栏通知
    如何从word文档复制公式到百度ueditor富文本编辑器
    如何从word文档复制公式到百度富文本编辑器
    如何从word文档复制公式到富文本编辑器
    如何从word文档复制图片到富文本编辑器
    关于百度ueditor粘贴图片自动上传
    关于umeditor粘贴图片自动上传
    PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****
    PAT 甲级 1056 Mice and Rice (25 分) (队列,读不懂题,读懂了一遍过)
    PAT 甲级 1055 The World's Richest (25 分)(简单题,要用printf和scanf,否则超时,string 的输入输出要注意)...
  • 原文地址:https://www.cnblogs.com/studyshufei/p/8947950.html
Copyright © 2011-2022 走看看