自定义大数类,用数组实现任意超大整数的加减乘运算

1.BigNumber.java

/*自定义大数类,用数组实现任意超大整数的加减乘运算*/ import java.util.Random; public class BigNumber { private int[] num; // 无参构造函数 public BigNumber() { } // 有参构造函数 public BigNumber(int i) { num = new int[i]; Random random = new Random(); int j; for (j = 0; j < i; j++) num[j] = random.nextInt(10); // 当生成的数首位是0的话,让重新生成 while (num[i - 1] == 0) { num[i - 1] = random.nextInt(10); } } // 加法 public static BigNumber add(BigNumber bigA, BigNumber bigB) { int alen = bigA.num.length; int blen = bigB.num.length; int clen = Math.max(alen, blen); BigNumber result = new BigNumber(); result.num = new int[clen]; if (alen >= blen) { for (int i = 0; i < blen; i++) result.num[i] = bigA.num[i] + bigB.num[i]; for (int j = blen; j < alen; j++) result.num[j] = bigA.num[j]; } else { for (int i = 0; i < alen; i++) result.num[i] = bigA.num[i] + bigB.num[i]; for (int j = alen; j < blen; j++) result.num[j] = bigB.num[j]; } for (int k = 0; k < clen - 1; k++) { if (result.num[k] >= 10) { result.num[k] -= 10; result.num[k + 1]++; } } return result; } // 减法 public static BigNumber subtract(BigNumber bigA, BigNumber bigB) { int alen = bigA.num.length; int blen = bigB.num.length; int clen = Math.max(alen, blen); BigNumber result = new BigNumber(); result.num = new int[clen]; if (alen > blen) { for (int i = 0; i < blen; i++) result.num[i] = bigA.num[i] - bigB.num[i]; for (int j = blen; j < alen; j++) result.num[j] = bigA.num[j]; } else if (alen < blen) { for (int i = 0; i < alen; i++) result.num[i] = bigB.num[i] - bigA.num[i]; for (int j = alen; j < blen; j++) result.num[j] = bigB.num[j]; } else { if (isBigger(bigA, bigB)) { for (int i = 0; i < clen; i++) { result.num[i] = bigA.num[i] - bigB.num[i]; } } else { for (int i = 0; i < clen; i++) { result.num[i] = bigB.num[i] - bigA.num[i]; } } } for (int k = 0; k < clen - 1; k++) { if (result.num[k] < 0) { result.num[k] += 10; result.num[k + 1]--; } } return result; } // 乘法 public static BigNumber multiply(BigNumber bigA, BigNumber bigB) { int alen = bigA.num.length; int blen = bigB.num.length; int clen = alen + blen; int t; BigNumber result = new BigNumber(); result.num = new int[clen]; for (int i = 0; i < alen; i++) { BigNumber temp = new BigNumber(); temp.num = new int[clen]; for (int j = 0; j < blen; j++) { temp.num[i + j] = bigA.num[i] * bigB.num[j]; } for (int k = 0; k < clen; k++) { if (temp.num[k] >= 10) { t = temp.num[k]; temp.num[k] = t % 10; temp.num[k + 1] += t / 10; } } result = add(result, temp); } return result; } // 判断两个位数相同的BigNumber那个大,前面的大于或者等于返回true,后面的大返回false public static boolean isBigger(BigNumber bigA, BigNumber bigB) { boolean flag = true; for (int i = bigA.num.length - 1; i >= 0; i--) { if (bigA.num[i] < bigB.num[i]) { flag = false; break; }else if(bigA.num[i] > bigB.num[i]){ break; }else continue; } return flag; } // 打印 public void print() { if (num[num.length - 1] != 0) System.out.print(num[num.length - 1]); for (int i = num.length - 2; i >= 0; i--) System.out.print(num[i]); System.out.println(); } public static void main(String[] args) { // TODO Auto-generated method stub BigNumber a = new BigNumber(1000); System.out.println("第一个数是:"); a.print(); BigNumber b = new BigNumber(900); System.out.println("第二个数是:"); b.print(); System.out.println("它们的和为:"); add(a, b).print(); System.out.println("它们的差为:"); subtract(a, b).print(); System.out.println("它们的乘积为:"); multiply(a, b).print(); } }

2.一个1000位的和一个900位的超大整数加减乘运行结果:

第一个数是: 3409623902240939742253505018635103786351481122299051343656310292191502810317910508416621573099940780378940746015010759667486541170396819990834637584461757805400823961473723945475000666057264775095497488435809909003578508605140157288635005809585516430381128094350813732505511936067114358707359177258375155751028322958313611974898276598549817139697140447930733035255175415196939023229275004365343776474658285733526107290998180156235532655821164827997966892136107263773151085340070567915181136240346982298299393045830283780519108710412787500104863182740108303120395124667877274490084254023570032884517535143073501940141367184607991332456035004345818297730255267830160054711788294847639398936566495897272550589644972772274105940871206793850720599621771023189993569701046552708681374396411834061005501132017103803326122121294938098915900426963706455233677911390324914264779359348321165575300332647026014076302130960273637106660851746878846675444823199383883174043010116365122038447384646149733821502534801 第二个数是: 342431089055272322843709517083105273201325747704250163006287834153569792961986121170885712705120920928403391526775334341645349494305044675593163450860555658875828733700252058376559394312683739838479848425106051036707872392524690589013058160251895736383093943224446351652648022692104230460509879723039227785923054616869462661485042842979691325354519982187025005779847992224567417597576257288882349918165472734747598949756042970966475549337262368987909019457466556906179835471438068432601747613842801223731251512326885730414428518159162173688707927851988169127345107741005933503870654542315325065123744502236142569747960432784963603669432409081806677998295606213601495096717613018389817986190378635915467036115370251976443344152253129793991866123079252810402375495059408904533533934518103357243123696602613543867364487811125442797856057578408533297508797726895597012229294040286143064535875917386211011 它们的和为: 3409623902240939742253505018635103786351481122299051343656310292191502810317910508416621573099940780721371835070283082511196058253502093192160385288711920811688658115043516907461121836942977480216418416839201435778912850250489651593679681402748967290936786970179547432757570312626508671391099015738223580857079359666186004499588865611607977391592876831024676259701527067844961715333505464875223499513886071656580724160460841641278375635512490182517949079161113043621143309907488165491438425122696900463772127793429233536562079676888336837367232170649127760586952030847712745928152686625317646727318758874325014267027097599036509491618208693053746149718424395175267795717721798718293941251891561021017052825787542520234538725834810463283129681428449021485599783302541649426294392786229820251384137047484139918696374097738282251169030220955572578312930721792700409324188263881855100093403689890149710678915674827638124917786294544734904253853356496892680900938607128594416078733527710685609738888745812 它们的差为: 3409623902240939742253505018635103786351481122299051343656310292191502810317910508416621573099940780036509656959738436823777024087291546789508889880211594799112989807903930983488879495171552069974576560032418382228244166959790662983590330216422065569825469218522080032253453559507720046023619338778526730644977286250441219450207687585491656887801404064836789810808823762548916331125044543855464053435430499810471490421535518671192689676129839473477984705111101483925158860772652970338923847357997064132826658298231334024476137743937238162842494194831088845653838218488041803052015821421822419041716311411821989613255636770179473173293861315637890445742086140485052313705854790976984856621241430773528048353502403024313673155907603124418311517815093024894387356099551455991068356006593847870626865216550067687955870144851593946662770632971840332154425100987949419205370454814787231057196975403902317473688587092909149295535408949022789097036289901875085447147413104135827998161241581613857904116323790 它们的乘积为: 1167561226113252369423536916609332831679289375849611546186289228339281375776624349289292337192280982415004789629275937555898069981496455548583016528205111088573244235610287710941476763295838167512258904397050526824480592941904129052649349447236107908223054627796071466106995335288698566848688970163307033243721280750277500434007101895365239186817587677623822915736378399368140825947527966349754734757332134295735265824287355901586172703837661377968255803287015644216341365338760766295282667075416333394683887092622963336331117889892560285133152505908157307360853116998646130657516941842758134691740934436201302481395890933831366109070457433808757364110876387444168505880103302973319046865799452061668745742785385029547482532420755156449387563078727085415848788548994475050568921864309353087443947563033739401218797513611615485716273687263420873534468965743137373244928828546506093733786837085721822415927142200848627826324565458959801532131406438485026406569160311843416527366841193941475464771470695397692701614058473737656772929407518103213314984474940056927702987772231167042352601086568394193531670163642424379757354779988564757918498280919727975918999363413715096772966828662374261505514463318086055318480046921520826184076102063242437451269500684305701775660576736711865046694817516998103336544615254019380468642537567693664331960197895357370173957143723703104712656338940641973395505605655978835228939547812738004935840267632257127646899991559707042461310609642918386798288873647717511622846369958757501128813031191544675755362403202339829284808625360815994169470821447420703015348742981133121845326725878429393856149504485736264006906355983784535876225542205274726759161396225315846491560178154484537011449797247677617515151564859080660644626796004068396677970925366742407747041000736994370814611307621206559183166964901523925449531748879183053776188913256345404857123721374893675021556893811

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值