本文為大大維原創(chuàng),最早于博客園發(fā)表,轉(zhuǎn)載請(qǐng)注明出處!?。?/strong>

一、概述

  C/C++中的int類型能表示的范圍是-2E31-2E31–1。unsigned類型能表示的范圍是0-2E32–1,即 0-4294967295。所以,int和unsigned類型變量,都不能保存超過10位的整數(shù)。有時(shí)我們需要參與運(yùn)算的數(shù),可能會(huì)遠(yuǎn)遠(yuǎn)不止10 位,例如,可能需要保留小數(shù)點(diǎn)后面100位(比如求π的值),那么,即便使用能表示很大數(shù)值范圍的double變量,但是由于double變量只有64位,所以還是不可能達(dá)到精確到小數(shù)點(diǎn)后面100位這樣的精度。double變量的精度也不足以表示一個(gè)100位的整數(shù)。一般我們稱這種基本數(shù)據(jù)類型無法表示的整數(shù)為大數(shù)。如何表示和存放大數(shù)呢?在c語言下,我們可以用數(shù)組存放和表示大整數(shù),一個(gè)數(shù)組元素,存放大數(shù)中的一位。而在c++中,使用標(biāo)準(zhǔn)庫的string類型,使得大數(shù)問題的計(jì)算更加實(shí)用(沒有最大值的限制),更加靈活(輸入更加簡(jiǎn)潔方便),更加簡(jiǎn)單(可以方便的處理小數(shù)之間的運(yùn)算)。

二、算法原理簡(jiǎn)單描述:

看如下大整數(shù)的加法運(yùn)算:

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

  answer每一位都是num1、num2和carry的和,因此,我們?cè)谳斎爰訑?shù)和被加數(shù)的string之后,可以將內(nèi)容進(jìn)行一次反轉(zhuǎn),這樣,answer[i]=num1[i]+num2[i]+carry[i-1]。反轉(zhuǎn)的一個(gè)重要的原因是可以方便的將向前的進(jìn)位和運(yùn)算變?yōu)橄蚝蟮倪M(jìn)位運(yùn)算,有利于充分發(fā)揮string的特點(diǎn)。在這里,我們可以使用<algorithm>頭文件下的reverse()函數(shù)方便的實(shí)現(xiàn)string的內(nèi)容反轉(zhuǎn)。當(dāng)運(yùn)算完畢后,反轉(zhuǎn)回來即可。

網(wǎng)友評(píng)論