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 1 function add(a,b){ 2 2 var arr=[]; 3 3 var len=a.length>b.length?a.length:(a.length<b.length?b.length:a.length); 4 4 var n=a.length>b.length?a.length-b.length:b.length-a.length; 5 5 if(a.length===b.length){ 6 6 for(var i=0;i<len;i++){ 7 7 arr.unshift(parseInt(a[i])+parseInt(b[i])) 8 8 } 9 9 }else{ 1010 var str=''; 1111 for(var i=0;i<n;i++){ 1212 str+='0'; 1313 } 1414 var _this= a.length>b.length ? str+b : str+a ; 1515 if(a.length>b.length){ 1616 for(var i=0;i<len;i++){ 1717 arr.unshift(parseInt(a[i])+parseInt(_this[i])) 1818 } 1919 }else{ 2020 for(var i=0;i<len;i++){ 2121 arr.unshift(parseInt(b[i])+parseInt(_this[i])) 2222 } 2323 } 2424 } 2525 for(var i=0;i<len-1;i++){ 2626 for(var j=0;j<len-1-i;j++){ 2727 if(arr[j]>=10){ 2828 var temp=arr[j]-10; 2929 arr[j]=temp; 3030 arr[j+1]=arr[j+1]+1; 3131 }else{ 3232 arr[j]=arr[j]; 3333 } 3434 } 3535 } 3636 3737 return arr.reverse().join(''); 3838 } 3939 4040 var a='111'; 4141 var b='22275676575' 4242 console.log(add(a,b)) 4343 console.log(parseInt(a)+parseInt(b)) 44 45再优化了下: 46 47 1 function add(a,b){ 48 2 var arr=[]; 49 3 var len=a.length>b.length?a.length:(a.length<b.length?b.length:a.length); 50 4 var n=a.length>b.length?a.length-b.length:b.length-a.length; 51 5 if(a.length===b.length){ 52 6 for(var i=0;i<len;i++){ 53 7 arr.unshift(parseInt(a[i])+parseInt(b[i])) 54 8 } 55 9 }else{ 5610 var _this= a.length>b.length ? b.padStart(len,'0') : a.padStart(len,'0') ; 5711 if(a.length>b.length){ 5812 for(var i=0;i<len;i++){ 5913 arr.unshift(parseInt(a[i])+parseInt(_this[i])) 6014 } 6115 }else{ 6216 for(var i=0;i<len;i++){ 6317 arr.unshift(parseInt(b[i])+parseInt(_this[i])) 6418 } 6519 } 6620 } 6721 for(var i=0;i<len-1;i++){ 6822 for(var j=0;j<len-1-i;j++){ 6923 if(arr[j]>=10){ 7024 var temp=arr[j]-10; 7125 arr[j]=temp; 7226 arr[j+1]=arr[j+1]+1; 7327 }else{ 7428 arr[j]=arr[j]; 7529 } 7630 } 7731 } 7832 return arr.reverse().join(''); 7933 } 8034 8135 var a='111'; 8236 var b='22275676575' 8337 console.log(add(a,b)) 8438 console.log(parseInt(a)+parseInt(b))

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

1 1 function add(a,b){ 2 2 var aStr=a.toString(); 3 3 var bStr=b.toString(); 4 4 var aLen=aStr.length; 5 5 var bLen=bStr.length; 6 6 var resStr=aLen>bLen?aStr:bStr; 7 7 var resLen=aLen>bLen?aLen:bLen; 8 8 var n= resLen - resStr.indexOf('.')-1; 9 9 return (a*10*n+b*10*n)/(10*n) 1010 } 1111 console.log(add(0.1,0.2))//0.3 1212 console.log(add(0.1,0.00000002))//0.10000002 1313 console.log(add(0.01,0.0000002))//0.0100002
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )