导航

JS一个算法题

Posted on 2018-04-25 22:48  小飞博客  阅读(362)  评论(0编辑  收藏  举报

题目:实现超出整数存储范围的两个大整数想加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