>

大整数十分大小,大整数四则运算

- 编辑:www.bifa688.com -

大整数十分大小,大整数四则运算

除法不可用手工算法来计算,其基本思想是反复做减法,看从被除数里面最多能减去多少个除数,商就是多少。

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

除法函数:

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

  • 如果前者绝对值小于后者直接返回零
  • 做减法时,不需要一个一个减,可以以除数*10^n为基数来减

    1 function division(a, b) { /输入两个字符串类型大数字/ 2 3 a = a.toString(); 4 5 b = b.toString(); 6 7 var sign = ''; 8 9 if(a.indexOf('-') >= 0 && b.indexOf('-') < 0){ 10 11 sign = '-'; 12 13 a = a.substr(1); 14 } 15 else if(a.indexOf('-') < 0 && b.indexOf('-') >= 0){ 16 17 sign = '-'; 18 19 b = b.substr(1); 20 } 21 22 if(a.indexOf('-') >= 0 && b.indexOf('-') >= 0){ 23 24 a = a.substr(1); 25 26 b = b.substr(1); 27 } 28 29 if(compare(a,b) < 0){ /绝对值a/ 30 31 return 0; 32 } 33 34 a = a.replace(/^0 /,''); 35 36 b = b.replace(/^0 /,''); 37 38 var divisionSub = function(x,y){ 39 40 var returnRes = [0]; 41 42 var xlen = x.length; 43 44 var ylen = y.length; 45 46 for(var i=0;i= 0){ 49 50 y = "0"; 51 52 returnRes.push(0); 53 } 54 } 55 56 while(compare(x,y) >= 0){ 57 58 returnRes[0] ; 59 60 x = subtraction(x,y); 61 } 62 63 return { 64 remainder : x, 65 quotient : returnRes.join('') 66 } 67 } 68 69 var divisionRes = '0'; 70 71 var divisionSubRes = { 72 remainder: a, 73 quotient: '0' 74 } 75 76 while(compare(divisionSubRes.remainder,b) >= 0){ 77 78 divisionSubRes = divisionSub(divisionSubRes.remainder,b); 79 80 divisionRes = addition(divisionRes,divisionSubRes.quotient); 81 82 } 83 84 return sign divisionRes; 85 }

    这样一来我们就已经有了大整数的四则运算的所有函数,可以将其封装起来,就成为了我们自己的一个简单的四则运算库。

    代码详情可以查看github :

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


加法函数:

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

  • 异符号相加时调用减法函数(减法函数后面给出)
  • 同符号相加先确定符号
  • 因为输入输出的为字符串,需要去除字符串开头的0

    1 function add(a, b) { /输入两个字符串类型大数字/ 2 3 if(a.indexOf('-') >= 0 && b.indexOf('-') < 0){ 4 5 return minus(b,a); 6 } 7 else if(a.indexOf('-') < 0 && b.indexOf('-') >= 0){ 8 9 return minus(a,b); 10 } 11 12 var sign = ""; 13 14 if(a.indexOf('-') >= 0 && b.indexOf('-') >= 0){ /两个负数相加,指定符号/ 15 16 sign = "-"; 17 18 a = a.substr(1); 19 20 b = b.substr(1); 21 } 22 23 var aArr = a.replace(/^0 /,'').split('').reverse(); 24 25 var bArr = b.replace(/^0 /,'').split('').reverse(); /利用倒序数组存储/ 26 27 var carry = 0; /进位值/ 28 29 var sumArr = []; 30 31 var len = Math.max(aArr.length, bArr.length); /取得位数较大的一个数的位数/ 32 33 for(var i=0;i<=len-1;i ){ 34 35 var digA = parseInt(aArr[i]) ? parseInt(aArr[i]) : 0; 36 37 var digB = parseInt(bArr[i]) ? parseInt(bArr[i]) : 0; 38 39 var digTotal = digA digB carry; 40 41 if(i == len-1){/排除'012' '012'这样的情况/ 42 43 if(digTotal > 0){ 44 45 sumArr.unshift(digTotal); 46 } 47 48 break; 49 } 50 51 carry = Number(digTotal >= 10); 52 53 digTotal = digTotal % 10; 54 55 sumArr.unshift(digTotal); 56 57 } 58 59 return sign sumArr.join(''); 60 }

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

 

 

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

比较小大函数:

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

    1 function compare(a,b){ 2 3 var sign = 1; 4 5 if(a.indexOf('-') >= 0 && b.indexOf('-') < 0){ /异符号比较/ 6 7 return -1; 8 } 9 else if(a.indexOf('-') < 0 && b.indexOf('-') >= 0){ /异符号比较/ 10 11 return 1; 12 } 13 else if(a.indexOf('-') >= 0 && b.indexOf('-') >= 0){ /必发88官网,同为负数,指定取反,同时改为正数比较方式/ 14 15 sign = -1; 16 17 a = a.substr(1); 18 19 b = b.substr(1); 20 } 21 22 a = a.replace(/^0 /,''); 23 24 b = b.replace(/^0 /,''); 25 26 var flag; 27 28 if(a.length < b.length){ /比较长度/ 29 30 flag = -1; 31 } 32 else if(a.length > b.length){ 33 34 flag = 1; 35 } 36 else{ 37 38 flag = 0; 39 } 40 41 if(flag == 0){ /相同长度逐位比较/ 42 43 var aArr = a.split(''); 44 45 var bArr = b.split(''); 46 47 for(var i=0;i<=aArr.length;i ){ 48 49 if(aArr[i] > bArr[i]){ 50 51 flag = 1; 52 53 break; 54 } 55 else if(aArr[i] > bArr[i]){ 56 57 flag = -1; 58 59 break; 60 } 61 } 62 } 63 64 return sign * flag; 65 }

 

减法函数:

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

    1 function minus(a, b) { 2 3 if(a.indexOf('-') >= 0 && b.indexOf('-') < 0){ 4 5 return add(a,"-" b); 6 } 7 else if(a.indexOf('-') < 0 && b.indexOf('-') >= 0){ 8 9 a = a.substr(1); 10 11 return add(a,b); 12 } 13 14 var sign = ""; 15 16 if(compare(a,b) < 0){ 17 18 var temp = b; 19 20 b = a; 21 22 a = temp; 23 24 sign = "-"; 25 } 26 27 var aArr = a.replace(/^0 /,'').split('').reverse(); 28 29 var bArr = b.replace(/^0 /,'').split('').reverse(); /利用倒序数组存储/ 30 31 var borrow = 0; /借位值/ 32 33 var minusArr = []; 34 35 var len = Math.max(aArr.length, bArr.length); /取得位数较大的一个数的位数/ 36 37 for(var i=0;i<=len-1;i ){ 38 39 var digA = parseInt(aArr[i]) ? parseInt(aArr[i]) : 0; 40 41 var digB = parseInt(bArr[i]) ? parseInt(bArr[i]) : 0; 42 43 var digMinus; 44 45 if(i == len-1){ 46 47 if(digA - borrow <= digB){ /最高位不够减直接跳出循环/ 48 49 break; 50 } 51 } 52 53 if(digA - digB - borrow >= 0){ 54 55 digMinus = digA - digB - borrow; 56 57 }else{ 58 59 digMinus = digA 10 - digB - borrow; 60 61 borrow = 1; 62 } 63 64 minusArr.unshift(digMinus); 65 66 } 67 68 return sign minusArr.join(''); 69 }

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

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

 


 

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

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

本文由必发88官网发布,转载请注明来源:大整数十分大小,大整数四则运算