美文网首页
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 大数加法

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