51Nod-1005 大数加法

简单模拟,将字符串转整形数组储存,标记正负数,分四种情况计算。

#include
#include
#include 
#include
#include

using namespace std;

const int MAXNUM = 10005;

char str1[MAXNUM], str2[MAXNUM];
int num1[MAXNUM], num2[MAXNUM];
int len1,len2,flag1,flag2;

int main()
{
    scanf("%s%s",str1,str2);
    
    memset(num1, 0, sizeof(num1));
    memset(num2, 0, sizeof(num2));
    flag1 = 0;
    flag2 = 0;
    len1 = strlen(str1);
    len2 = strlen(str2);
    
    if(str1[0]=='0' && str2[0]=='0')
    {
         printf("0\n");
         return 0;
    }
    
    if(str1[0] == '-')
    {
        flag1 = 1;
        for(int i = 0; i < len1 - 1; i ++)
        {
            num1[i] = str1[len1 - 1 - i] - '0';
        }
    }
    else
    {
        for(int i = 0; i < len1; i ++)
        {
            num1[i] = str1[len1 - 1 - i] - '0';
        }
    }
    
    if(str2[0] == '-')
    {
        flag2 = 1;
        for(int i = 0; i < len2 - 1; i ++)
        {
            num2[i] = str2[len2 - 1 - i] - '0';
        }
    }
    else
    {
        for(int i = 0; i < len2; i++)
        {
            num2[i] = str2[len2 - 1 - i] - '0';
        }
    }
    
    if(!flag1 && !flag2)
    {
        int maxLen = max(len1, len2);
        int uselessZero = MAXNUM - 1;
        for(int i = 0; i < maxLen; i ++)
        {
            num1[i] += num2[i];
            if(num1[i] >= 10)
            {
                num1[i] -= 10;
                num1[i+1] ++;
            }
        } 
        while(!num1[uselessZero])
        {
            uselessZero--;
        }
        for(; uselessZero >= 0; uselessZero --)
        {
            printf("%d", num1[uselessZero]);
        }
        printf("\n");
    } 
    if(flag1 && flag2)
    {
        int maxLen = max(len1 - 1, len2 - 1);
        int uselessZero = MAXNUM - 1;
        for(int i = 0; i < maxLen; i++)
        {
            num1[i] += num2[i];
            if(num1[i] >= 10)
            {
                num1[i] -= 10;
                num1[i+1] ++;
            }
        }
        printf("-");
        while(!num1[uselessZero])
        {
            uselessZero--;
        }
        for(; uselessZero >= 0; uselessZero --)
        {
            printf("%d", num1[uselessZero]);
        }
        printf("\n");
    }
    if(flag1 && !flag2)
    {
        int flagBig = 0;
        if( (len1 - 1) < len2)
        {
            flagBig = 1;
        }
        else
        {
            if( (len1 - 1) == len2)
            {
                for(int i = len2 - 1; i >= 0; i --)
                {
                    if(num2[i] > num1[i])
                    {
                        flagBig = 1;
                        break;
                    }
                    else
                    {
                        if(num2[i] < num1[i])
                        {
                            break;
                        }
                    }
                }
            }
        }
        
        if(flagBig == 1)
        {
            int uselessZero = MAXNUM - 1;
            for(int i = 0; i < len2; i++)
            {
                num2[i] -= num1[i];
                if(num2[i] < 0)
                {
                    num2[i] += 10;
                    num2[i+1] --;
                }
            }
            while(!num2[uselessZero])
            {
                uselessZero --;
            }
            for(; uselessZero >= 0; uselessZero --)
            {
                printf("%d", num2[uselessZero]);
            }
            printf("\n");
        }
        else
        {
            int uselessZero = MAXNUM - 1;
            for(int i = 0; i < len1; i++)
            {
                num1[i] -= num2[i];
                if(num1[i] < 0)
                {
                    num1[i] += 10;
                    num1[i+1] --;
                }
            }
            while(!num1[uselessZero])
            {
                uselessZero--;
            }
            printf("-");
            for(; uselessZero >= 0; uselessZero --)
            {
                printf("%d", num1[uselessZero]);
            }
            printf("\n");
        }
    }
    if(!flag1 && flag2)
    {
        int flagBig = 0;
        if( (len2 - 1) < len1)
        {
            flagBig = 1;
        }
        else
        {
            if( (len2 - 1) == len1)
            {
                for(int i = len1 - 1; i >= 0; i --)
                {
                    if(num1[i] > num2[i])
                    {
                        flagBig = 1;
                        break;
                    }
                    else
                    {
                        if(num1[i] < num2[i])
                        {
                            break;
                        }
                    }
                }
            }
        }
        
        if(flagBig == 0)
        {
            int uselessZero = MAXNUM - 1;
            for(int i = 0; i < len2; i++)
            {
                num2[i] -= num1[i];
                if(num2[i] < 0)
                {
                    num2[i] += 10;
                    num2[i+1] --;
                }
            }
            while(!num2[uselessZero])
            {
                uselessZero--;
            }
            printf("-");
            for(; uselessZero >= 0; uselessZero --)
            {
                printf("%d", num2[uselessZero]);
            }
            printf("\n");
        }
        else
        {
            int uselessZero = MAXNUM - 1;
            for(int i = 0; i < len1; i++)
            {
                num1[i] -= num2[i];
                if(num1[i] < 0)
                {
                    num1[i] += 10;
                    num1[i+1] --;
                }
            }
            while(!num1[uselessZero])
            {
                uselessZero--;
            }
            for(; uselessZero >= 0; uselessZero --)
            {
                printf("%d", num1[uselessZero]);
            }
            printf("\n");
        }
    }
    
    return 0;
} 

你可能感兴趣的:(51Nod-1005 大数加法)