zoukankan      html  css  js  c++  java
  • 51nod 1005 大数加法

    给出2个大整数A,B,计算A+B的结果。
    Input
    第1行:大数A
    第2行:大数B
    (A,B的长度 <= 10000 需注意:A B有可能为负数)
    Output
    输出A + B
    Input示例
    68932147586
    468711654886
    Output示例
    537643802472

    这个交上去有几组数据超时,大佬们是用python和java写的 我好尴尬的。。

    2017年7月20号更新
    自己一直没有搞懂的问题,还是小伙伴来纠正的,自己数据范围开小了,少掉了一个0,就这一个问题 ,代码是很棒哒!

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define N 10000+10
    
    char str1[N],str2[N];
    int num1[N],num2[N];
    
    void Conversion(char *p,int l,int *num,int *j)
    {
        int i;
        for(i = l-1; i >= 0;i --)
        {
    
            num[(*j)++] = p[i]-'0';
        }
    
    }
    
    void Addition(int *num1,int *num2,int *i,int l)//加法 
    {
        int j = 0;
        while(j < l)
        {
            num1[(*i)++]+=num2[j++];
        }
        j = 0;
        while(j < l||num1[j])
        {
            if( num1[j] >= 10)
            {
                num1[j]%=10;
                num1[++j]+= 1;
            }
            else
                ++j;
        }
        *i = j;
    }
    
    void Judge(int *num1,int *num2,int *find,int l1,int l2,int *max) 
    {
        //正数大find为1,负数大find为3 
        //num1大为max=1,num2大为max = 2 
        l1--;
        l2--;
        if(*find == 1)//num1为负数
        {
            if(l1>l2)//l1大于l2时,num1大 
            {
                *find = 3;
                *max = 1;
            }
            else if(l1 == l2)//l1==l2即两数长度相等时 
            {
                while(num1[l1]==num2[l2]&&num1[l1]&&num2[l2])
                {
                    l1--;
                    l2--;
                }
                if(num1[l1] > num2[l2])//num1大 
                {
                    *find = 3;
                    *max = 1;
                }
                else//num2大 
                {
                    *find = 1;
                    *max = 2;
                }
    
            }
            else//l2小于l2 
            {
                *find = 1;
                *max = 2;
            }
    
        } 
        else if(*find==2)//num2为负数 
        {
            if(l2 > l1)
            {
                *find = 3;
                *max = 2;
            }
            else if(l2 == l1)
            {
                while(num1[l1]==num2[l2]&&num1[l1]&&num2[l2])
                {
                    l1--;
                    l2--;
                }
                if(num1[l1] >= num2[l2])
                {
                    *find = 1;
                    *max = 1;
                }
                else
                {
                    *find = 3;
                    *max = 2;
                }
    
            }
            else
            {
                *find = 1;
                *max = 1;
            }
    
        }
        else//两数同号 
        {
            if(l1 > l2)
                *max = 1;
            else if(l1 == l2)
            {
                while(num1[l1]==num2[l2]&&l1>0&&l2>0)
                {
                    l1--;
                    l2--;
                }
                if(num1[l1] >= num2[l2])
                {
                    *max = 1;
                }
                else
                {
                    *max = 2;
                }
            }
            else
                *max = 2;
    
        }
    }
    
    void Subtraction(int *num1,int *num2,int l1,int l2,int *i)//减法
    {//*i指向差的长度 
        int j = 0;
    
        while(j < l2)
        {
            num1[(*i)++] -= num2[j++]; 
        }
        j = l1-1;
        while( num1[j]== 0&&j)//去掉前导0 
        {
           j--;
        }
        if( j == 0)
        {
            *i = 1;
            return;
        }
        j = 0;  
        while(j < l1)
        {
            if( num1[j] < 0)
            {
                num1[j]+= 10;
                num1[++j]-= 1;
            }
            else
                ++j;
        }
        *i = j;
    }
    
    void Print(int *num,int find,int n)//输出函数 
    {
        n--;//先自减1 
        if(find == 3)//如果运算后有负号,输出负号 
            printf("-");
        while(num[n]==0&&n)//去掉前导0 
        {
            n--;
        }
        if(n==0)
        {
            printf("%d
    ",num[n]);//只如果全部为0,只输出一个0并结束函数 
            return;
        }
        while(n >= 0)
        {
    
            printf("%d",num[n]);
            n--;
        }
        printf("
    ");
    }
    
    void Count(char str1[],char str2[],int *num1,int *num2)//完成大数相加 
    {
        int i,j,k;
        int m,n;
        int l1,l2;
        int find=0;
        int max;
        max = 0;
        char *p = str1,*q = str2;
    
        l1 = strlen(str1);
        l2 = strlen(str2);
    
        p = str1;
        find = 0;
        if(str1[0] == '-')//若str1为负数,find标记为1,并去掉负号 
        {
            find = 1;
            p++;
            l1--;
        }
    
        q = str2;
        if(str2[0] == '-')//若str2为负数,find标记为2,并去掉负号 
        {
            find = 2;
            q++;
            l2--;
        }
    
        if(str1[0]=='-'&&str2[0] == '-')//若同为负,find标记为3,并去掉负号 
            find = 3;
        i = 0;
        Conversion(p,l1,num1,&i);//把字符转为数字 
        j = 0;
        Conversion(q,l2,num2,&j);
    
        m = 0;  
        if(find == 0||find == 3)//若两数同号 
        {
            Judge(num1,num2,&find,i,j,&max);//判断两者大小,用max做标记 
            if(max == 1)//若num1大 
            {
                Addition(num1,num2,&m,l1);//相加 
                Print(num1,find,m);//输出 
            }
            if(max == 2)//若num2大 
            {
                Addition(num2,num1,&m,l2);
                Print(num2,find,m);
            }
        }
        n = 0;
        if(find == 1||find == 2)//若两者异号 
        {
            Judge(num1,num2,&find,i,j,&max);//判断两数大小 
            if(max== 1)
            {
                Subtraction(num1,num2,i,j,&n);//相减 
                Print(num1,find,n);//输出 
            }
            else if(max == 2)
            {
                Subtraction(num2,num1,j,i,&n);
                Print(num2,find,n);
            }
        }   
    }
    
    int main()
    {
    
        while(scanf("%s",str1)!=EOF)
        {
            scanf("%s",str2);
            memset(num1,0,sizeof(num1));
            memset(num2,0,sizeof(num2));
            Count(str1,str2,num1,num2);//完成大数相加 
        }
        return 0;
     } 
  • 相关阅读:
    准备改进回复功能
    今天的任务
    日历已加上
    web.config中globalization设置的问题
    Request获取url信息的各种方法比较
    增加了高级评论功能
    如何修改日历的CSS
    推荐有关MasterPages的三篇文章
    如何定制日历控件显示的星期文字
    FreeTextBox的问题终于解决了
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7350130.html
Copyright © 2011-2022 走看看