高精度計(jì)算(一)

概述

當(dāng)計(jì)算的數(shù)值非常大或是對(duì)于計(jì)算的精度要求非常高時(shí),用已知的數(shù)據(jù)類型無法精確地表示數(shù)值○海可以采用數(shù)組來模擬大數(shù)運(yùn)算的過程卸夕。

高精度加法

兩個(gè)大數(shù)進(jìn)行相加計(jì)算時(shí)层释,要解決三個(gè)問題

  1. 如何存儲(chǔ)
  2. 如何計(jì)算
  3. 如何輸出答案

先解決第一個(gè)問題,數(shù)據(jù)地存儲(chǔ)快集,由于數(shù)據(jù)過于龐大贡羔,已知的數(shù)據(jù)類型無法精確地表示數(shù)值廉白,會(huì)發(fā)生數(shù)據(jù)溢出問題。此時(shí)可考慮將數(shù)據(jù)拆分乖寒,將大數(shù)分割成若干個(gè)0~9數(shù)字組成的整體猴蹂。這樣的結(jié)構(gòu)能讓我們聯(lián)想到數(shù)組。但是楣嘁,若是整數(shù)數(shù)組磅轻,在輸入時(shí)較難將數(shù)字存儲(chǔ)在各個(gè)元素空間內(nèi),此時(shí)可考慮使用字符串形式進(jìn)行輸入逐虚,在存儲(chǔ)后再進(jìn)行轉(zhuǎn)換聋溜。

const int maxn=1e10+5;
char s1[maxn]={0},s2[maxn]={0};
cin>>s1>>s2;

輸入完成后,再去考慮計(jì)算問題叭爱。首先撮躁,字符類型直接相加的結(jié)果并不正確,需要將其轉(zhuǎn)化為整數(shù)數(shù)字买雾“崖可利用ASCII碼差值來進(jìn)行處理。且在進(jìn)行計(jì)算時(shí)漓穿,模擬豎式加法計(jì)算過程嗤军,需要從低位開始向高位相加計(jì)算且注意過程中的進(jìn)位。在相加時(shí)晃危,加數(shù)和被加數(shù)位數(shù)可能不同叙赚,需要低位對(duì)齊。實(shí)現(xiàn)低位對(duì)齊可在轉(zhuǎn)換時(shí)進(jìn)行倒序存放山害。

// 轉(zhuǎn)換過程
int num[maxn]={0};
int len=strlen(s);

for(int i=0;i<len;i++)
{
    num[i]=s[len-1-i]-'0';
}

倒序轉(zhuǎn)換好之后纠俭,在模擬豎式計(jì)算進(jìn)行處理。注意過程中的進(jìn)位浪慌。

int ans[maxn]={0};
for(int i=0;i<maxLen;i++)
{
    ans[i]+=num1[i]+num2[i];
    ans[i+1]=ans[i]/10;//進(jìn)位
    ans[i]%=10;//保留余數(shù)
}

計(jì)算完成之后可以進(jìn)行輸出冤荆,這時(shí)候需要注意答案是倒著存放的,需要倒序進(jìn)行輸出并去除前導(dǎo)0;

int flag=0;
for(int i=maxLen+1;i>=0;i--)
{
    if(ans[i]!=0||i==0) flag=1;
    if(falg) cout<<ans[i];
}

高精度減法

高精度減法和高精度加法過程類似权纤,字符串輸入后模擬豎式進(jìn)行計(jì)算钓简。

前面數(shù)據(jù)輸入和倒置存放的過程相同就不再重復(fù)。再計(jì)算過程中需要注意的問題就是可能相減會(huì)出現(xiàn)負(fù)數(shù)汹想,兩數(shù)相減需要考慮絕對(duì)值大小問題外邓。

計(jì)算a-b,若a>=b,ans=a-b;若a<b,ans=-(b-a);故需要判斷大小,可根據(jù)長(zhǎng)度來判斷大小古掏,長(zhǎng)度相同則使用字符串比較函數(shù)损话,從字符串內(nèi)容上進(jìn)行判斷。

int len1=strlen(s1);
int len2=strlen(s2);

if((len1>len2) || (len2==len1&&strcmp(s1,s2)>=0 )
{
    //ans=a-b;
    for(int i=0;i<len1;i++)
    {
        if(num1[i]<num2[i]){
            num1[i]+=10;
            num1[i+1]--;
        }
        ans[i]=num1[i]-num2[i];
    }
}else
{
    //ans=-(b-a);
    for(int i=0;i<len2;i++)
    {
        if(num2[i]<num1[i]){
            num2[i]+=10;
            num2[i+1]--;
        }
        ans[i]=num2[i]-num1[i];
    }
    cout<<"-";
}

算完后,再和前面一樣進(jìn)行倒序輸出答案丧枪,注意刪除前導(dǎo)0即可光涂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拧烦,隨后出現(xiàn)的幾起案子忘闻,更是在濱河造成了極大的恐慌,老刑警劉巖恋博,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件齐佳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡债沮,警方通過查閱死者的電腦和手機(jī)炼吴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秦士,“玉大人缺厉,你說我怎么就攤上這事永高∷硗粒” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵命爬,是天一觀的道長(zhǎng)曹傀。 經(jīng)常有香客問我,道長(zhǎng)饲宛,這世上最難降的妖魔是什么皆愉? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮艇抠,結(jié)果婚禮上幕庐,老公的妹妹穿的比我還像新娘。我一直安慰自己家淤,他們只是感情好异剥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著絮重,像睡著了一般冤寿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上青伤,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天督怜,我揣著相機(jī)與錄音,去河邊找鬼狠角。 笑死号杠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丰歌。 我是一名探鬼主播姨蟋,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼辣吃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了芬探?” 一聲冷哼從身側(cè)響起神得,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎偷仿,沒想到半個(gè)月后圃泡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溯革,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年狼忱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片别智。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宗苍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薄榛,到底是詐尸還是另有隱情讳窟,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布敞恋,位于F島的核電站丽啡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏硬猫。R本人自食惡果不足惜补箍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啸蜜。 院中可真熱鬧坑雅,春花似錦、人聲如沸衬横。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冕香。三九已至蛹尝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悉尾,已是汗流浹背突那。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留构眯,地道東北人愕难。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親猫缭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葱弟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容