首页 > 代码库 > 大数加法

大数加法

问题:我有一个非常简单的问题给你。给定两个整数A和B,你的工作是计算A + B的总和

分析:不能定义两个整数去相加,当数太大后,数据就会溢出,比如:112233445566778899+998877665544332211。所以使用两个字符数组,将每一个数作为数组的一个元素存进去,然后再把两个字符数组相加存入一个结果的数组。

困难:两个数组相加,会存在进位和溢出

解决:将数组里面的元素倒过来然后相加,若进位了,设置一个判断是否进位的条件,若进位了acc=1,没进位acc=0,sum[i]=s1[i]-‘0‘+s2[i]-‘0‘+acc。

代码:

#include <stdio.h>
#include<string.h>
#include <stdlib.h>

int main()
{
    char s1[1000],s2[1000],sum[1001],s3[1000],s4[1000];
    int t,x;
    void reverse(char*s);
    void add(char*s1,char*s2,char*sum);
    scanf("%d",&t);
    x=1;
    while(t--)
    {
        s1[1000]=0;
        s2[1000]=0;
        scanf("%s %s",s1,s2);
        strcpy(s3,s1);
        strcpy(s4,s2);
        add(s1,s2,sum);
        if(t!=0)
            printf("Case %d:\n%s + %s = %s\n\n",x,s3,s4,sum);
        else
            printf("Case %d:\n%s + %s = %s\n",x,s3,s4,sum);
        x++;
    }
    return 0;
}

void reverse(char*s)
{
    int length;
    int i=0;
    char temp;
    length=strlen(s);
    while(i<length-i-1)
    {
        temp=s[i];
        s[i]=s[length-i-1];
        s[length-i-1]=temp;
        i++;
    }
}

void add(char*s1,char*s2,char*sum)
{
    int len1=strlen(s1);
    int len2=strlen(s2);
    int acc=0,temp,i;
    reverse(s1);
    reverse(s2);
    for(i=0;i<len1 && i<len2;i++)
    {
        temp=s1[i]-0+s2[i]-0+acc;
        sum[i]=temp%10+0;
        if(temp>=10)
            acc=1;
        else
            acc=0;
    }
    if(i<len1)
    {
        for(;i<len1;i++)
        {
            temp=s1[i]-0+acc;
            sum[i]=temp%10+0;
            if(temp>=10)
                acc=1;
            else
                acc=0;
        }
    }
    if(i<len2)
    {
        for(;i<len2;i++)
        {
            temp=s2[i]-0+acc;
            sum[i]=temp%10+0;
            if(temp>=10)
                acc=1;
            else
                acc=0;
        }
    }
    if(acc==1)
        sum[i++]=1;
    sum[i]=\0;
    reverse(sum);

}

 

大数加法