lq_jichu_Main29&Main30(大数问题)

大数问题


Mian29(高精度加法):

问题描述

输入两个整数ab,输出这两个整数的和。ab都不超过100位。

算法描述

由于ab都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。

定义一个数组AA[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b

计算c=a+b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。

最后将C输出即可。

输入格式

输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。

输出格式

输出一行,表示a+b的值。

样例输入

20100122201001221234567890

2010012220100122

样例输出

20100122203011233454668012

解题思路:

        方法一:定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储。计算c=a+b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。(较为复杂,代码较长)

lq_jichu_Main29&Main30(大数问题)_第1张图片
Main29方式一

方式二:后来想到可以使用java.math包下的BigInteger,通过字符串创建BigInteger对象,直接调用add()方法就可以实现大数相加了(方法简单明了,方便)


lq_jichu_Main29&Main30(大数问题)_第2张图片
Main29方法二

Main30:

问题描述

输入一个正整数n,输出n!的值。

其中n!=1*2*3*…*n

算法描述

n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数aA[0]表示a的个位,A[1]表示a的十位,依次类推。

a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。

首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。

输入格式

输入包含一个正整数nn<=1000。

输出格式

输出n!的准确值。

样例输入

10

样例输出

3628800

解题思路: 

      仍然使用BigInteger对象,用for()循环实现阶乘,范围是1-n。循环体内调用String.valueOf(i)将i转为字符串,再转为BigInteger对象,调用multiply()方法实现BigInteger对象的相加,一次性通过。


lq_jichu_Main29&Main30(大数问题)_第3张图片
Main30

总结:大数问题首选BigInteger,其次是用数组表示,前者简单明了,后者复杂难以运算实现。

你可能感兴趣的:(lq_jichu_Main29&Main30(大数问题))