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