0基礎學算法 第四彈 高精度

    今天寫這個的時候心情是很是糟糕的,由於我寫了這篇博文四遍,每次都由於網頁問題,不是須要刷新就是要重開,以致於我昨天一天和今天上午寫了整整4遍沒提交成功,不嘮嗑了,切入正題。c++

    高精度是一種計算大數的算法,一般咱們計算的時候會用int,要是範圍大了就會用long long類型,這有張表,共你們參考算法

一旦數據超過了long long型,就會用到了高精度,高精度的基本原理是將數字分別存入數組的每一項中,而後將它模擬豎式計算,恰好他知足豎式計算的條件,只要當心進退位的問題就行了數組

    因爲洛谷上有模版題,因此今天咱們就結合題目一塊兒來理解高精度spa

高精度的加減法code

     P1601 https://www.luogu.com.cn/problem/P1601blog

     P1601是高精度的加法,先思考一下,不要看題解,若是你有思路,就去實現一下吧,沒有思路也沒事,無論怎樣,你均可以繼續看這篇博客。ci

     好,請確保你已經思考過了,若是你看過個人第一彈的流程圖,就把你的思路畫下來,而後就把它實現好了。get

大體思路編譯器

    若是你完成了前面的內容,那麼恭喜你,你離成功只有一步了,首先看看流程圖,梳理一下思路,再照着流程圖完成代碼吧博客

    思路就是這樣了,那咱們能夠根據流程圖,去模擬代碼,達到實現高精度加法,來給你們看看個人代碼

#include <bits/stdc++.h>
using namespace std;
int main(){
    char a[505],b[505];
    cin>>a>>b;
    int alen,blen,sum[505],f=0,k=0;
    alen=strlen(a);
    blen=strlen(b);
    while(alen!=0||blen!=0)
    {
        int a1=0,b1=0;
        if(alen>0)
        {
            a1=a[--alen]-'0';
        }
        if(blen>0)
        {
            b1=b[--blen]-'0';
        }
        int t=a1+b1+f;
        f=t/10;
        if(t>9)
        {
            t=t%10;//這裏是進位操做,千萬不能漏
        }
        sum[k++]=t;
    }
    if(f)
    {
        sum[k++]=1;
    }
    for(int i=k-1;i>=0;i--)
    {
        cout<<sum[i];
    }
    return 0;
} 

是很是吻合流程圖的,大家能夠本身去試試,或者運行一下,這個高精度加法也能夠去提交一下,另外思考一下高精度減法,減法和加法很是類似,區別就在於減法要注意退位的事,還有就是要注意可能有負數,記得加負號,接下來只要你能理解高精度加法的內容,就能夠本身獨立完成高精度減法,我能夠再給你們一個思路(實際上是一個豎式)

好,看了這個豎式後有沒有豁然開朗的感受?沒有就對了本身試一試,也許就柳暗花明又一村了呢?

接下來,咱們來說乘法  其實乘法原理是同樣的,都和加法同樣,模擬出豎式的運算,而後注意一下進位的問題就ok了,由於我知道你認真看到這已經很辛苦了,因此我就直接給出代碼好了。

#include <bits/stdc++.h>
#define N 2001
using namespace std;
int main(){
    string s1,s2;
    int a[N],b[N],c[2*N],la,lb;
    cin>>s1>>s2;
    la = s1.length(),lb=s2.length();
    //cout<<la<<lb;
    for(int i=0;i<la;i++) 
        a[i]=s1[la-i-1]-'0';
    for(int i=0;i<lb;i++)
        b[i]=s2[lb-i-1]-'0';
    for(int i=0;i<la;i++)
        for(int j=0;j<lb;j++)
            c[i+j]+=a[i]*b[j];
    int l=la+lb;
    //cout<<l;
    //return 0;
    for(int i=0;i<l;i++)
    {
        c[i+1]+=c[i]/10;
        c[i]%=10;    
    }        
    while(c[l-1]==0&&l>1) l--;
    for(int i=l-1;i>=0;i--)
    {
        cout<<c[i];    
    } 
    return 0;
}

以上就是今天的內容了,你是否是感受缺了什麼,對,我還沒寫除法的,若是你還想學到關於除法的高精度算法,就請關注➕一下我,我會在下期開頭公佈答案,今天的課後練習就是本身把今天的高精度代碼在編譯器中寫一遍。

    若是你以爲我寫的好,或喜歡個人0基礎學算法系列,請你點贊👍,和關注➕我,我會給你們帶來更多的算法,下一期預告 第五彈 填坑!

    若是你對我講的有什麼問題,你能夠在評論區留言,我會在填天坑系列中解答全部的問題

相關文章
相關標籤/搜索