题目:实现超出整数存储范围的两个大整数想加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进这个空数组,标记数组④

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

 function add(a,b){
var arr=[];
var len=a.length>b.length?a.length:(a.length<b.length?b.length:a.length);
var n=a.length>b.length?a.length-b.length:b.length-a.length;
if(a.length===b.length){
for(var i=0;i<len;i++){
arr.unshift(parseInt(a[i])+parseInt(b[i]))
}
}else{
var str='';
for(var i=0;i<n;i++){
str+='0';
}
var _this= a.length>b.length ? str+b : str+a ;
if(a.length>b.length){
for(var i=0;i<len;i++){
arr.unshift(parseInt(a[i])+parseInt(_this[i]))
}
}else{
for(var i=0;i<len;i++){
arr.unshift(parseInt(b[i])+parseInt(_this[i]))
}
}
}
for(var i=0;i<len-1;i++){
for(var j=0;j<len-1-i;j++){
if(arr[j]>=10){
var temp=arr[j]-10;
arr[j]=temp;
arr[j+1]=arr[j+1]+1;
}else{
arr[j]=arr[j];
}
}
} return arr.reverse().join('');
} var a='111';
var b='22275676575'
console.log(add(a,b))
console.log(parseInt(a)+parseInt(b))
再优化了下:
 function add(a,b){
var arr=[];
var len=a.length>b.length?a.length:(a.length<b.length?b.length:a.length);
var n=a.length>b.length?a.length-b.length:b.length-a.length;
if(a.length===b.length){
for(var i=0;i<len;i++){
arr.unshift(parseInt(a[i])+parseInt(b[i]))
}
}else{
var _this= a.length>b.length ? b.padStart(len,'0') : a.padStart(len,'0') ;
if(a.length>b.length){
for(var i=0;i<len;i++){
arr.unshift(parseInt(a[i])+parseInt(_this[i]))
}
}else{
for(var i=0;i<len;i++){
arr.unshift(parseInt(b[i])+parseInt(_this[i]))
}
}
}
for(var i=0;i<len-1;i++){
for(var j=0;j<len-1-i;j++){
if(arr[j]>=10){
var temp=arr[j]-10;
arr[j]=temp;
arr[j+1]=arr[j+1]+1;
}else{
arr[j]=arr[j];
}
}
}
return arr.reverse().join('');
} var a='111';
var b='22275676575'
console.log(add(a,b))
console.log(parseInt(a)+parseInt(b))
 

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

 function add(a,b){
var aStr=a.toString();
var bStr=b.toString();
var aLen=aStr.length;
var bLen=bStr.length;
var resStr=aLen>bLen?aStr:bStr;
var resLen=aLen>bLen?aLen:bLen;
var n= resLen - resStr.indexOf('.')-1;
return (a*10*n+b*10*n)/(10*n)
}
console.log(add(0.1,0.2))//0.3
console.log(add(0.1,0.00000002))//0.10000002
console.log(add(0.01,0.0000002))//0.0100002

最新文章

  1. 使用iText对pdf做权限的操作(不允许修改,不允许复制,不允许另存为),并且加水印等
  2. ext.net与extjs的关系
  3. NAT 网络地址转换
  4. ios开发学习笔记(这里一定有你想要的东西,全部免费)
  5. 可以创建专业的客户端/服务器视频会议应用程序的音频和视频控件LEADTOOLS Video Conferencing SDK
  6. TCP/IP 编程
  7. Pipe - POJ 1039(线段相交交点)
  8. VC断点不可用的问题
  9. hdu 1029(hash)
  10. mysql 数据库插入语句之insert into,replace into ,insert ignore
  11. Linux环境进程间通信(二):信号(下)
  12. ArrayList源码剖析
  13. Android sdk配置 常见问题及处理方法
  14. 《JUnit实战(第2版)》读书笔记
  15. Linux命令:pushd
  16. Python:Day44 Javascript
  17. 【jquery隐藏、显示事件and提示callback】【淡入淡出fadeToggle】【滑入滑出slideToggle】【动画animate】【停止动画stop】
  18. PHP 命名空间与自动加载机制
  19. jsonp原理及同源策略
  20. 如何在python3环境下的Django中使用MySQL数据库

热门文章

  1. sqler sql 转rest api 源码解析(三) rest协议
  2. tailor+ skipper 实现micro-frontends 简单试用
  3. The difference among ioctl, unlocked_ioctl and compat_ioctl (RT)
  4. python list 转换为str
  5. Golang cpu的使用设置--GOMAXPROCS
  6. HDMI初识
  7. js写法【2】
  8. ALGO-115_蓝桥杯_算法训练_和为T(枚举)
  9. ALGO-12_蓝桥杯_算法训练_幂方分解(递归)
  10. 基于无锁队列和c++11的高性能线程池