无限长数字的加减运算

俗话说:“人力有时尽,而天意无穷”,事情总是不会尽如人意的,当我们还在为计算机的出现,把我们常用的最简单的计算变得省心省力时,却也发现了计算机也是有自己的限制的,所以人们就不得不去做一些工作,使得计算机能实现任意长度的数据运算的能力。

本文内容

本文就基于JS实现,在JS中,如何计算任意长度的数字计算。我们呢也都知道,JS在页面获取到的数据,一般都是以字符串的形式获取到的,而字符串的长度过长的话,就不能直接转换成数据进行计算了,字符串的话,很明显的,我们也只能想到改变成数组的方法了吧。当然,改变成对象也可以,只是对象的取值方面,性能本就比数组差,操作也不方便,所以很自然地,还是选择数组操作吧。

从简单到复杂的一步一步的来吧。

任意长度数字执行加 1 操作

  • 1:把目标字符串变成数组。
  • 2:取出数组的最后一个元素,进行加 1 操作
  • 3:把最后一个元素从数组中去除(方便以后的逻辑计算),保存到arr
  • 4:如果最后一个元素加 1 之后,有进位的话,则第三步的新数组arr再执行第二步的操作,这样循环下去,知道第五步的逻辑出现
  • 5:如果最后一位的元素 加 1 之后,没有进位,则结束
  • 6:把加 1 之后的值重新push到原来的数组
  • 7:返回这个数组。
  • 8:利用返回的数组,合成字符串

当然啦,如果只是按照上面的这样去做,如果你没有考虑周全,也许会有问题出现的,我觉得吧,看到这里的人,有兴趣的可以想想哪一个步骤,在代码实现的时候,会出现问题的(这里不是说逻辑有问题的哦,逻辑是好着呢)。也可以直接看下面的代码吧:可以测试的哦。

也可以直接查看demo

懒得去查看源代码的话,就看下核心代码吧(不做注释了):


function f(arr){
    var last;
	
    if(arr.length == 0){
	last = 0;
    }else{
	last = arr.pop();
    }
		
    if(last == 9){
	last = 0;
	arr = f(arr);
    }else{
    	last = last-0+1;
    }
    arr.push(last);
    return arr;
}


任意长度数字执行减 1 操作

看明白上面步骤以及思想的,这里应该没有什么问题了吧?

只要改动一下核心代码即可,示例如下:

减1操作的源代码:demo

代码的逻辑和上述的差不多,这里就不再写了,直接给个测试例子吧,

PS:这里和上面的两个例子,输入的值,都要是大于0 的哦,没有做负数的减法呢。

任意长度的加 1 或者 减1 操作

经过一些改动,现在就可以以同一个函数,执行加1或者减1的操作了,测试代码:

当然啦,可以点击demo,直接查看源代码,如果有更好的建议,请指教。

两个任意长度的数相加

两个任意长度的字符串数字相加的话,只是唯一的一点差异就是判断何时进位的问题了,所以,可以这样对加法的逻辑进行一下描述:

  • 1:把目标字符串变成数组,分别为arr1arr2
  • 2:分别取出两个数组的最后一个元素,lastarr1lastarr2
  • 3:并在原数组把分别去掉最后一个元素,获取到新的数组arr1arr2
  • 4:把取出的lastarr1lastarr2进行相加处理,判断是否有进位。
  • 5:如果有进位,那么使用当前的arr1进行加 1 操作(前面的例子)。
  • 6:判断两个数组,是否有数组已经为空数组。
  • 7:如果两个数组都不为空数组,则继续执行第2步的操作,进行循环。
  • 8:如果arr2为空数组(我假设的arr2数组的长度小于arr1数组),那么结束并且返回arr1,(因为我使用这个数组作为返回值)
  • 9:返回数组,并合成字符串显示。

逻辑呢,就是这么个逻辑,代码呢,有些长,这里就不贴了,可以直接看示例的,当然代码也会在示例页直接看到的,没有进行压缩,也没有删掉关键的注释,不过知道逻辑了,代码应该也没有什么难度了,有兴趣的可以直接点击:demo,然后查看源代码即可

看示例吧,有兴趣的可以测测哦,支持正负数的相加和相减操作哦(没有美化页面,只注重的功能,有点懒了)。

OK,就到这里吧,如果您发现文中有任何问题,请您指教,该页也算一个计算相关的,如果您有发现有数据计算时错误的,也请您提出,非常感谢。

本文地址:http://www.zhangyunling.com/?p=127

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>