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;
 } 
原文地址:https://www.cnblogs.com/hellocheng/p/7350130.html