Code Kata:大整数比较大小&大整数四则运算---加减法 javascript实现
大整数的四则运算已经是老生常谈的问题了。很多的库也已经包含了各种各样的解决方案。
作为练习,我们从最简单的加减法开始。
加减法的核心思路是用倒序数组来模拟一个大数,然后将两个大数的利用竖式进行运算。
加法函数:
- 异符号相加时调用减法函数(减法函数后面给出)
- 同符号相加先确定符号
- 因为输入输出的为字符串,需要去除字符串开头的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实现的更多相关文章
- 编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示
编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示 效果如下: 实现代码: import java.util.Arrays; import java.util.Scanne ...
- Go语言的9大优势和3大缺点, GO语言最初的定位就是互联网时代的C语言, 我为什么放弃Go语言
Go语言的9大优势和3大缺点 转用一门新语言通常是一项大决策,尤其是当你的团队成员中只有一个使用过它时.今年 Stream 团队的主要编程语言从 Python 转向了 Go.本文解释了其背后的九大原因 ...
- Linux 查看磁盘容量、查找大文件、查找大目录
Linux 查看磁盘容量.查找大文件.查找大目录 磁盘统计 查看磁盘使用情况 df -h 文件统计 查找/home 目录下大于800M的文件 find /home -type f -size +800 ...
- bat坐拥大数据。数据挖掘/大数据给他们带来什么。
阿里巴巴CTO即阿里云负责人王坚博士说过一句话:云计算和大数据,你们都理解错了. 实际上,对于大数据究竟是什么业界并无共识.大数据并不是什么新鲜事物.信息革命带来的除了信息的更高效地生产.流通和消 ...
- 如何用一个语句判断一个整数是不是二的整数次幂——从一道简单的面试题浅谈C语言的类型提升(type promotion)
最近招聘季,看JULY大哥的面试100题时,碰到这么一个扩展问题: 如何用一个语句判断一个整数是不是二的整数次幂?(此题在编程之美也有) easy, 2的整数次幂的二进制形式只有一个1,只要用i和i- ...
- 跟上节奏 大数据时代十大必备IT技能
跟上节奏 大数据时代十大必备IT技能 新的想法诞生新的技术,从而造出许多新词,云计算.大数据.BYOD.社交媒体……在互联网时代,各种新词层出不穷,让人应接不暇.这些新的技术,这些新兴应用和对应的IT ...
- SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表)
SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表) swap_join_inputs是针对哈希连接的hint,它的含义 ...
- 随机产生1-12的整数 , 根据产生整数输出一下该月份的季节信息(Math.random()和if语句的应用)
package com.summer.cn; /** * @author Summer *随机产生1-12的整数 , 根据产生整数输出一下该月份的季节信息 */ public class Test04 ...
- 给出一个整数,将这个整数中每位上的数字进行反转(JavaScript编程)
一.问题描述:给出一个整数,将这个整数中每位上的数字进行反转.示例:输入:123,输出321:输入-123,输出-321:输入120,输出-21 二.问题分析与解决: 需要将给出的整数反转,注意示例中 ...
随机推荐
- 基于HTML5及WebGl下生成的json格式的工控SCADA风机叶轮旋转
突然有个想法,如果能把一些用到不同的知识点放到同一个界面上,并且放到一个盒子里,这样我如果要看什么东西就可以很直接显示出来,而且这个盒子一定要能打开.我用HT实现了我的想法,代码一百多行,这么少的代码 ...
- 无需安装SqlServer打开并管理SqlServer数据库的方法
本地安装的数据库是SqlServer2008R2的 在附加一个数据库文件时出现了以下错误 错误的原因就是附加的数据库版本太高,而本地数据库版本太低导致的 通过各种方式才查询到附加的数据库版本是SqlS ...
- LeetCode 53. Maximum Subarray(最大的子数组)
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- asp.net在类库中使用EF 6.0时的相关配置
前提:之前使用EF的配置都是直接使用NuGet安装在项目中,然后直接修改web.config中的connectionString,然后创建相关dbcontext直接使用就可以了.此次为直接将EF安装在 ...
- Python CRM项目一
开发环境: 语言Python3.X以上 MTV WEB框架 Django 前端框架 jQuery+bootstrap 数据库 MySQL 运行环境 安装Python3.x 安装Django 除IE8以 ...
- vue之地址栏#号问题
mode的两个值 histroy:当你使用 history 模式时,URL 就像正常的 url,例如 http://jsapng.com/lms/,也好看! hash:默认'hash'值,但是hash ...
- position,display,float,overflow,margin,padding之间的相互影响
1.元素分为块级元素和行内元素, 块级元素可以设置宽高,会自动换行,并且会发生相邻margin的合并问题.行内元素设置宽和高无效,以水平方向排列,(行内元素,绝对定位,浮动元素不会发生外边距合并)并且 ...
- 关于mysql的临时表并行的问题
mysql的临时表并行是没问题的 以为临时表是基于会话的 1.因为在mysql里面每个会话的sessionid 不一样 2.其实就是会话级别的临时表 DB2里面有会话级别 全局级别的临时表,Orac ...
- 使用Identity Server 4建立Authorization Server (2)
第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第一部分主要是建立了一个简单的Identity Server. 接下来继续: 建立Web Api项目 ...
- react-native多图选择、图片裁剪(支持ad/ios图片个数控制)
扯淡: 目前关于rn比较知名并且封装好的图片选择控件很多,不过能同时支持多图片上传,个数控制兼容iOS/Ad的却寥寥无几,而今天介绍的这款框架可以实现:图片裁剪.最大图片个数限制.拍照.本地相册等功能 ...