51Nod-1005-大数加法

#include<cstdio>  
#include<cstring>  
#include<algorithm>  
using namespace std;  
const int maxn = 10010;  
char a[maxn],b[maxn];  
int aa[maxn],bb[maxn];  
int main()  
{  
   // freopen("a.txt","r",stdin);  
    while(scanf("%s%s",a,b)!=EOF)  
    {  
        memset(aa,0,sizeof(aa));  
        memset(bb,0,sizeof(bb));  
        int l1=strlen(a),l2=strlen(b),i;  
        int flag1=0,flag2=0;  
        if(a[0]=='0'&&b[0]=='0') printf("0\n"); //特殊考虑a和b都为0的情况  
        else  
        {  
            if(a[0]=='-')  
            {  
                flag1=1;  //判断 a是否是负数 是的话置标记  
                for(i=0;i<l1-1;i++) //然后 a[0]是负号可以不用处理  
                {  
                aa[i]=a[l1-i-1]-'0';  
                }  
            }  
            else  //否则  直接转换就好  
            {  
                 for(i=0;i<l1;i++)  
                 {  
                    aa[i]=a[l1-i-1]-'0';  
                 }  
            }  
            if(b[0]=='-') //同理判断  b  
            {  
                flag2=1;  
                for(i=0;i<l2-1;i++)  
                {  
                    bb[i]=b[l2-i-1]-'0';  
                }  
            }  
            else  
            {  
                 for(i=0;i<l2;i++)  
                 {  
                    bb[i]=b[l2-i-1]-'0';  
                 }  
            }  
            int s=0,ans=0;    //分四种情况  分别对a,b进行处理  
            if(!flag1&&!flag2)   //a,b都为正数  
            {  
                l1=max(l1,l2);  
                for(i=0;i<l1;i++)  
                {  
                    bb[i]+=aa[i];  
                    if(bb[i]>=10) {  bb[i]-=10; bb[i+1]++; }  
                }  
                while(!bb[l1]) l1--;  
                for(;l1>=0;l1--) printf("%d",bb[l1]);  
                printf("\n");  
            }  
            else if(!flag1&&flag2) //a为正数,b为负数  
            {    //判断a,b的绝对值谁大谁小  
                if(l1+1>l2) ans=1; //先判断长度  
                else if(l1+1==l2) //长度相等,判断每一位的大小  
                {  
                    for(i=l1-1;i>=0;i--)  
                    {  
                        if(aa[i]>bb[i]) { ans=1;break;} //当前位大于  则a>b  
                        else if(aa[i]<bb[i]) break; //否则小于  
                    }  
                }  
                if(ans)  //a的绝对值大于b  例如332  -3  或者 332  -331  
                {  
                    for(i=0;i<l1;i++) //只要循环到l1-1即可  
                    {  
                        aa[i]-=bb[i];  
                        if(aa[i]<0)  
                        {  
                            aa[i]+=10;  
                            aa[i+1]--;  
                        }  
                    }  
                    while(!aa[l1]) l1--;  
                    for(;l1>=0;l1--) printf("%d",aa[l1]);  
                    printf("\n");  
                }  
                else //a的绝对值小于b  
                {  
                    for(i=0;i<l2-1;i++) //循环到 l2-2 ,因为b是负数  
                    {  
                        bb[i]-=aa[i];  
                        if(bb[i]<0)  
                        {  
                            bb[i]+=10;  
                            bb[i+1]--;  
                        }  
                    }  
                    while(!bb[l2]) l2--;  //如果此时 bb变成0,比如 333  -333的情况  
                    if(l2<0) printf("0\n"); //输出0  
                    else  
                    {  
                        printf("-"); //输出负号  
                        for(;l2>=0;l2--) printf("%d",bb[l2]);  
                        printf("\n");  
                    }  
                }  
            }  
            else if(flag1&&!flag2) //和上面同理  
            {  
                if(l2+1>l1) ans=1;  
                else if(l2+1==l1)  
                {  
                    for(i=l2-1;i>=0;i--)  
                    {  
                        if(bb[i]>aa[i]) { ans=1;break;}  
                        else if(bb[i]<aa[i])break;  
                    }  
                }  
                if(ans)  
                {  
                    for(i=0;i<l2;i++)  
                    {  
                        bb[i]-=aa[i];  
                        if(bb[i]<0)  
                        {  
                            bb[i]+=10;  
                            bb[i+1]--;  
                        }  
                    }  
                    while(!bb[l2]) l2--;  
                    for(;l2>=0;l2--) printf("%d",bb[l2]);  
                    printf("\n");  
                }  
                else  
                {  
                    for(i=0;i<l1-1;i++)  
                    {  
                        aa[i]-=bb[i];  
                        if(aa[i]<0)  
                        {  
                            aa[i]+=10;  
                            aa[i+1]--;  
                        }  
                    }  
                    while(!aa[l1]) l1--;  
                    if(l1<0) printf("0\n");  
                    else  
                    {  
                        printf("-");  
                        for(;l1>=0;l1--) printf("%d",aa[l1]);  
                        printf("\n");  
                    }  
                }  
            }  
            else if(flag1&&flag2) //同为负数  
            {  
                printf("-");  
                l1=max(l1,l2);  
                for(i=0;i<l1-1;i++)  
                {  
                    bb[i]+=aa[i];  
                    s=bb[i]/10;  
                    bb[i]%=10;  
                    bb[i+1]+=s;  
                }  
                while(!bb[l1]) l1--;  
                for(;l1>=0;l1--) printf("%d",bb[l1]);  
                printf("\n");  
            }  
        }  
    }  
    return 0;  
}  

---------------------------------------------------------------------------------------------------------------------

#include <stdio.h>
#include <string.h>
#define _MAX 10005
int product[_MAX] = {0};
char numOne[_MAX] = {0}, numTwo[_MAX] = {0};
char numOneUp[_MAX] = {0}, numTwoUp[_MAX] = {0};    //倒序存储位置
int absMax = 1;
//递归进位函数
void Carrying(int tag, int i, int *p)
{
    p[i] += tag;
    if (p[i] > 9)
    {
        tag = 1;
        p[i] -= 10;
        Carrying(tag, i + 1, p);    //写成Carrying(tag, i, j+1, p);也成立,为了让i+j递增而已
    }
    return ;
}

//递归退位函数
void Abdicate(int tag, int i, int *p)
{
    p[i] += tag;
    if (p[i] < 0)
    {
        tag = -1;
        p[i] += 10;
        Abdicate(tag, i + 1, p);
    }
    return ;
}

//判断大小
void size(int numOneLen, int numTwoLen)
{
    int i, j;
    if (numOneLen < numTwoLen)
    {
        absMax = 2;
        for (i = 0; i < numTwoLen; i++)
        {
            numOneUp[i] ^= numTwoUp[i];
            numTwoUp[i] ^= numOneUp[i];
            numOneUp[i] ^= numTwoUp[i];
        }
        return ;
    }
    if (numOneLen == numTwoLen)
    {
        for (i = numOneLen - 1; i >= 0; i--)
        {
            if (numOneUp[i] < numTwoUp[i])
            {
                absMax = 2;
                for (j = 0; j < numTwoLen; j++)
                {
                    numOneUp[j] ^= numTwoUp[j];
                    numTwoUp[j] ^= numOneUp[j];
                    numOneUp[j] ^= numTwoUp[j];
                }
                return ;
            }
            else if (numOneUp[i] > numTwoUp[i])
            {
                return ;
            }
        }
    }
    return ;
}

//加减处理
void addOrSub(int numOneLen, int numTwoLen, int flag)   //flag加法为1减法为0
{
    int i, key = 0, tag, numLenMax, numLenMin;
    numOneLen = numOneLen - 1;
    numTwoLen = numTwoLen - 1;
    //数据逆序
    for (i = numOneLen; i > 0; i--)
    {
        numOneUp[key++] = numOne[i];
    }
    if (numOne[0] != '-')
    {
        numOneUp[key] = numOne[0];
        numOneLen++;
    }
    key = 0;
    for (i = numTwoLen; i > 0; i--)
    {
        numTwoUp[key++] = numTwo[i];
    }
    if (numTwo[0] != '-')
    {
        numTwoUp[key] = numTwo[0];
        numTwoLen++;
    }
    numLenMax = numOneLen > numTwoLen ? numOneLen : numTwoLen;
    numLenMin = numOneLen < numTwoLen ? numOneLen : numTwoLen;
    //逐位相加
    if (flag)
    {
        size(numOneLen, numTwoLen);
        for (i = 0; i < numLenMax; i++)
        {
            product[i] = (int)numOneUp[i] - 48;
        }
        for (i = 0; i < numLenMin; i++)
        {
            tag = (int)numTwoUp[i]-48;
            Carrying(tag, i, product);                          //递归
        }
    }
    //逐位相减
    else
    {
        size(numOneLen, numTwoLen);
        for (i = 0; i < numLenMax; i++)
        {
            product[i] = (int)numOneUp[i] - 48;
        }
        for (i = 0; i < numLenMin; i++)
        {
            tag = -((int)numTwoUp[i]-48);
            Abdicate(tag, i, product);                          //递归
        }
    }
}

//输出结果
void print()
{
    int i, j;
    //倒序输出结果
    for (i = _MAX - 1; i > 0; i--)
    {
        if (product[i] != 0)
        {
            break;                               //查找到第一个不等于0的跳出
        }
    }
    for (j = i; j >= 0; j--)
    {
        printf("%d",product[j]);
    }
    printf("\n");
}

int main(int argc, const char * argv[])
{
    int numOneLen, numTwoLen;

    scanf("%s %s",numOne,numTwo);                    //存数据

    numOneLen=(int)strlen(numOne);
    numTwoLen=(int)strlen(numTwo);

    if (numOne[0] == '-' && numTwo[0] == '-')
    {
        addOrSub(numOneLen, numTwoLen, 1);
        printf("-");
        print();
    }
    else if (numOne[0] == '-' || numTwo[0] == '-')
    {
        addOrSub(numOneLen, numTwoLen, 0);
        if ((numOne[0] == '-' && absMax == 1) || (numTwo[0] == '-' && absMax == 2))
        {
            printf("-");
        }
        print();
    }
    else
    {
        addOrSub(numOneLen, numTwoLen, 1);
        print();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41138935/article/details/80012979
今日推荐