大數加法 以及 大數減法的思路

大數加法代碼 註釋 如下:


#include<iostream>
#include<ctype.h>
#include<cstdio>

#include<algorithm>
using namespace std;
#include<cstring>
#include<string.h>


char A[10005],B[10005],res[10005];

int cmp(char *a,char *b)
{
    int lena=strlen(a);
    int lenb=strlen(b);
    if(lena!=lenb)             //如果 a的長度不等與b的長度   返回a《b爲真      如果a》b返回假
        return lena<lenb;
    for(int i=0;i<lena;i++)     //如果a的長度==b的長度  緊接着比較每個字符的大小 返回 a[i]<b[i]爲真  如果a[i]》b[i] 返回假
        if(a[i]!=b[i])
            return a[i]<b[i];
return 0;
}

void add(char *a,char *b)           // 相加時不明大小
{
    int lena=strlen(a);
    int lenb=strlen(b);
    if(lena>lenb)                       //兩個正數相加   確定某一個長度一直爲最大長度 方便一次性計算
        swap(a,b),swap(lena,lenb);

    reverse(a,a+lena);
    reverse(b,b+lenb);

    int len=lenb;
    for(int i=lena;i<len;i++)           // len=lenb    這個最大的定值 就是上面 所說的方便一次性計算的意思
        a[i]='0';                   //  將兩個串的長度一致  因此需要對 短的字符串後面填‘0’;

    int c=0;
    for(int i=0;i<len;i++)              //大數相加
    {
        int t=(a[i]-'0')+(b[i]-'0')+c;
        c=(t>=10);
        res[i]=(t-10*c)+'0';  //  因爲前一部分是數字 需加‘0’
    }
    if(c)
        res[len++]='1';                 //最後一位數
    res[len]='\0';              //終止條件
    reverse(res,res+len);           //再轉置
}

void jian(char *a,char *b)   //知道大小    a大與b   1.a的位數大與b   2.位數相等並且a》b
{
    int lena=strlen(a);
    int lenb=strlen(b);

    reverse(a,a+lena);          //轉置
    reverse(b,b+lenb);

    int len=lena;               //最長的賦給一個變量

    for(int i=lenb;i<len;i++)     //對短的進行填‘0’
        b[i]='0';

    int c=0;
    for(int i=0;i<len;i++)      //大數減法
    {
        int t=(a[i]-'0')-(b[i]-'0')-c;
        c=(t<0);
        res[i]=t+10*c+'0';
    }
    res[len]='\0';      //終止符

    while(len>1&&res[len-1]=='0')       //大數減法的一個特殊判定條件
        res[--len]='\0';
    reverse(res,res+len);
}


int main()
{
    cin>>A>>B;

        bool isa=isdigit(A[0]);   //判斷正負  如果爲正返回真  爲負返回假
        bool isb=isdigit(B[0]);
        if(isa)                 //如果大數A 是正數
        {
            if(isb)          // 並且 大數B爲正數
                add(A,B);           //  則符合第一個情況        《正正《正數相加》大加小/小加大》
            else
            {
                if(cmp( A , B + 1 ))    //條件爲真說明B+1大於A  《正負《正負相加==正負號(同最大的)(大的減小的)》正負號(同最大的)(大減小)》
                {                       //而此處的判斷 是判斷負的大  意思是b+1>a
                    cout<<"-";
                    jian(B+1,A);            //傳值的時候非常巧  先傳大的 再傳小的
                }
                else            //否則就是A>B
                    jian(A,B+1);        //先傳大的再傳小的
            }
        }
        else
        {
            if(isb)     // a爲負  並且b爲正
            {
                if(cmp(A+1,B))      //判斷 正值是否大於負值
                    jian(B,A+1);        //如果正值大於負值  直接進行相減   因爲最後是一個正數  所以 直接套用正數減正數(大數減法)此處減少了許多麻煩
                else
                {
                    cout<<"-";      // 正值小於負值     因此最後答案是-的   因此多輸出一個負值
                    jian(A+1,B);        //大數減法
                }
            }
            else
            {
                cout<<"-";      //都爲負的  直接輸出-
                add(A+1,B+1);   //-值+ -值 得到的結果是兩個負值相加  因此調用 大數加法
            }
        }
        cout<<res<<endl;    //輸出最後的字符串
    return 0;
除法}


大數除法的思路:

解題思路
基本的思想是反覆做減法,看看從被除數裏最多能減去多少個除數,商就是多少。一個
一個減顯然太慢,如何減得更快一些呢?以7546 除以23 爲例來看一下:開始商爲0。先減
去23 的100 倍,就是2300,發現夠減3 次,餘下646。於是商的值就增加300。然後用646
減去230,發現夠減2 次,餘下186,於是商的值增加20。最後用186減去23,夠減8 次,
因此最終商就是328。
所以本題的核心是要寫一個大整數的減法函數,然後反覆調用該函數進行減法操作。
計算除數的10 倍、100 倍的時候,不用做乘法,直接在除數後面補0 即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章