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

来源:互联网 发布:gta5亚洲美女捏脸数据 编辑:程序博客网 时间:2024/05/10 08:21

大数加法代码 注释 如下:

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