美文网首页
51Nod-1005 大数加法

51Nod-1005 大数加法

作者: 黑笑小说 | 来源:发表于2017-11-27 14:31 被阅读0次

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

#include<iostream>
#include<string>
#include<cstring> 
#include<cstdio>
#include<algorithm>

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 大数加法

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

  • 机试常用算法和题型-大数专题

    大数专题 字符加减关系,实现任意长度整数相加 大数加法,进阶转换版 大数浮点数加法 大数运算之阶乘

  • 大数加法

  • 大数加法

  • 大数加法

  • 无符号大数相加(C语言实现)

    请用自己熟悉的语言,实现无符号大数加法操作。a. 完成两个大数的加法 A + B = C,并正确处理进位情况;b....

  • 大数乘法与加法

    1、大数乘法 (1)转换并反转,字符串转换为数字并将字序反转; (2)自动移位,逐位相乘,添加最后的进位; (3)...

  • 大数加法【Java实现】

    Java大数加法运算 将两个加法的相应位从高位到低位依次压入栈stackA和stackB中,结果栈stackSum...

  • 大数乘法

    其实大数乘法就是在考虑大数加法的进位的同时,考虑字符串num1和字符串num2相乘时,每一位所在的位置,以及加法运...

  • 2019.4.18

    上午的数学活动一千以内不进位的加法,我写题的时候小朋友很开心,能算这么大数字的加法了,感觉自己好厉害。计算过程...

网友评论

      本文标题:51Nod-1005 大数加法

      本文链接:https://www.haomeiwen.com/subject/gnfdbxtx.html