大整数的四则运算已经是老生常谈的问题了。很多的库也已经包含了各种各样的解决方案。

作为练习,我们从最简单的加减法开始。

加减法的核心思路是用倒序数组来模拟一个大数,然后将两个大数的利用竖式进行运算。

加法函数:

  • 异符号相加时调用减法函数(减法函数后面给出)
  • 同符号相加先确定符号
  • 因为输入输出的为字符串,需要去除字符串开头的0
 function add(a, b) { /*输入两个字符串类型大数字*/

     if(a.indexOf('-') >= 0 && b.indexOf('-') < 0){

         return minus(b,a);
}
else if(a.indexOf('-') < 0 && b.indexOf('-') >= 0){ return minus(a,b);
} var sign = ""; if(a.indexOf('-') >= 0 && b.indexOf('-') >= 0){ /*两个负数相加,指定符号*/ sign = "-"; a = a.substr(1); b = b.substr(1);
} var aArr = a.replace(/^0+/,'').split('').reverse(); var bArr = b.replace(/^0+/,'').split('').reverse(); /*利用倒序数组存储*/ var carry = 0; /*进位值*/ var sumArr = []; var len = Math.max(aArr.length, bArr.length); /*取得位数较大的一个数的位数*/ for(var i=0;i<=len-1;i++){ var digA = parseInt(aArr[i]) ? parseInt(aArr[i]) : 0; var digB = parseInt(bArr[i]) ? parseInt(bArr[i]) : 0; var digTotal = digA + digB + carry; if(i == len-1){/*排除'012' + '012'这样的情况*/ if(digTotal > 0){ sumArr.unshift(digTotal);
} break;
} carry = Number(digTotal >= 10); digTotal = digTotal % 10; sumArr.unshift(digTotal); } return sign + sumArr.join('');
}

在写减法时,发现需要先比较大小,因此需要一个大数字比较大小的函数

比较小大函数:

  • 异符号比较大小,正数大于负数
  • 正数比较大小,先比较长度,长度大的数值大
  • 正数长度一致,从最高位开始逐位比较,只到出现较大的一方,则数值更大
  • 负数比较大小,方法同正数,结果取反即可
  • 因为输入输出的为字符串,需要去除字符串开头的0
 function compare(a,b){

     var sign = 1;

     if(a.indexOf('-') >= 0 && b.indexOf('-') < 0){ /*异符号比较*/

         return -1;
}
else if(a.indexOf('-') < 0 && b.indexOf('-') >= 0){ /*异符号比较*/ return 1;
}
else if(a.indexOf('-') >= 0 && b.indexOf('-') >= 0){ /*同为负数,指定取反,同时改为正数比较方式*/ sign = -1; a = a.substr(1); b = b.substr(1);
} a = a.replace(/^0+/,''); b = b.replace(/^0+/,''); var flag; if(a.length < b.length){ /*比较长度*/ flag = -1;
}
else if(a.length > b.length){ flag = 1;
}
else{ flag = 0;
} if(flag == 0){ /*相同长度逐位比较*/ var aArr = a.split(''); var bArr = b.split(''); for(var i=0;i<=aArr.length;i++){ if(aArr[i] > bArr[i]){ flag = 1; break;
}
else if(aArr[i] > bArr[i]){ flag = -1; break;
}
}
} return sign * flag;
}

减法函数:

  • 异符号相减时调用加法函数
  • 同符号相减需要先确定大小
  • 因为输入输出的为字符串,需要去除字符串开头的0
 function minus(a, b) {

     if(a.indexOf('-') >= 0 && b.indexOf('-') < 0){

         return add(a,"-" + b);
}
else if(a.indexOf('-') < 0 && b.indexOf('-') >= 0){ a = a.substr(1); return add(a,b);
} var sign = ""; if(compare(a,b) < 0){ var temp = b; b = a; a = temp; sign = "-";
} var aArr = a.replace(/^0+/,'').split('').reverse(); var bArr = b.replace(/^0+/,'').split('').reverse(); /*利用倒序数组存储*/ var borrow = 0; /*借位值*/ var minusArr = []; var len = Math.max(aArr.length, bArr.length); /*取得位数较大的一个数的位数*/ for(var i=0;i<=len-1;i++){ var digA = parseInt(aArr[i]) ? parseInt(aArr[i]) : 0; var digB = parseInt(bArr[i]) ? parseInt(bArr[i]) : 0; var digMinus; if(i == len-1){ if(digA - borrow <= digB){ /*最高位不够减直接跳出循环*/ break;
}
} if(digA - digB - borrow >= 0){ digMinus = digA - digB - borrow; }else{ digMinus = digA + 10 - digB - borrow; borrow = 1;
} minusArr.unshift(digMinus); } return sign + minusArr.join('');
}

以上给出的是带符号大整数加减法基础实现,但效率并不是特别高。

网上也有通过10000进制优化的竖式算法,以及通过位运算实现四则运算的方法,大家也可以搜索看看,今天的练习就到这里了,下周会给出乘除法的基本实现。


如果喜欢我的文章,可以扫描二维码关注我的微信公众号

争取每天都分享一点我自己的开发和练习体验~

Code Kata:大整数比较大小&大整数四则运算---加减法 javascript实现的更多相关文章

  1. 编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示

    编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示 效果如下: 实现代码: import java.util.Arrays; import java.util.Scanne ...

  2. Go语言的9大优势和3大缺点, GO语言最初的定位就是互联网时代的C语言, 我为什么放弃Go语言

    Go语言的9大优势和3大缺点 转用一门新语言通常是一项大决策,尤其是当你的团队成员中只有一个使用过它时.今年 Stream 团队的主要编程语言从 Python 转向了 Go.本文解释了其背后的九大原因 ...

  3. Linux 查看磁盘容量、查找大文件、查找大目录

    Linux 查看磁盘容量.查找大文件.查找大目录 磁盘统计 查看磁盘使用情况 df -h 文件统计 查找/home 目录下大于800M的文件 find /home -type f -size +800 ...

  4. bat坐拥大数据。数据挖掘/大数据给他们带来什么。

    阿里巴巴CTO即阿里云负责人王坚博士说过一句话:云计算和大数据,你们都理解错了.   实际上,对于大数据究竟是什么业界并无共识.大数据并不是什么新鲜事物.信息革命带来的除了信息的更高效地生产.流通和消 ...

  5. 如何用一个语句判断一个整数是不是二的整数次幂——从一道简单的面试题浅谈C语言的类型提升(type promotion)

    最近招聘季,看JULY大哥的面试100题时,碰到这么一个扩展问题: 如何用一个语句判断一个整数是不是二的整数次幂?(此题在编程之美也有) easy, 2的整数次幂的二进制形式只有一个1,只要用i和i- ...

  6. 跟上节奏 大数据时代十大必备IT技能

    跟上节奏 大数据时代十大必备IT技能 新的想法诞生新的技术,从而造出许多新词,云计算.大数据.BYOD.社交媒体……在互联网时代,各种新词层出不穷,让人应接不暇.这些新的技术,这些新兴应用和对应的IT ...

  7. SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表)

    SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表) swap_join_inputs是针对哈希连接的hint,它的含义 ...

  8. 随机产生1-12的整数 , 根据产生整数输出一下该月份的季节信息(Math.random()和if语句的应用)

    package com.summer.cn; /** * @author Summer *随机产生1-12的整数 , 根据产生整数输出一下该月份的季节信息 */ public class Test04 ...

  9. 给出一个整数,将这个整数中每位上的数字进行反转(JavaScript编程)

    一.问题描述:给出一个整数,将这个整数中每位上的数字进行反转.示例:输入:123,输出321:输入-123,输出-321:输入120,输出-21 二.问题分析与解决: 需要将给出的整数反转,注意示例中 ...

随机推荐

  1. EF 数据重复和缺失问题(select 错误 )

    字段有 id,name,password,sex 1.错误举例: var data = db.User.Select(d => d):   2修正 var data = db.User.Sele ...

  2. Java规范推荐

    Java规范推荐 推荐:http://blog.csdn.net/tristansmile/article/details/7989670 命名规范 项目名:全部小写 Package 的命名:应该都是 ...

  3. jstl 中 <c:foreach> 多级循环

  4. spring框架应用系列三:切面编程(带参数)

    本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7786715.html 解决问题 1.分离业务监控与业务处理.简单点 ...

  5. Summer Holiday

    Summer Holiday Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  6. IIC接口下的24C02 驱动分析

    本节来学习IIC接口下的24C02 驱动分析,本节学完后,再来学习Linux下如何使用IIC操作24C02 1.I2C通信介绍 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据,是一个多 ...

  7. Android 开发笔记___登陆app

    package com.example.alimjan.hello_world; /** * Created by alimjan on 7/4/2017. */ import android.con ...

  8. <template> 标签

    <template> 元素,用于描述一个标准的以 DOM 为基础的方案来实现客户端模板.该模板允许你定义一段可以被转为 HTML 的标记,在页面加载时不生效,但可以在后续进行动态实例化.( ...

  9. display:none,float小秘密

    一个元素不管是块元素还是行内元素   在添加了 display:none 之后,就变成了不可见的块元素,可以给他添加长度和高度   在float之后内联元素也会隐性成为  inline-block   ...

  10. javaSE基础

     变量 1.变量就是数据存储空间的表示. 2.标识符命名规则:变量名=首字母+其余部分 ①首字母:字母.下划线.“$”符号(开头) ②其余部分:数字.字母.下划线“$” ③应避开关键字:int int ...