大数加法 以及 大数减法的思路

大数加法代码 注释 如下:


#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 即可。

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