大数a+b

对于大数加法,我看到了三种类型题:

一种是正整数的加法,一种是正数加法(正数可以是小数),还有一种整数(整数可以是负数)加法,下面分析下这三种的做法。

正整数加法:http://acm.hdu.edu.cn/showproblem.php?pid=1002(题目链接)

代码如下:

#include
#include
#include
using namespace std;
char aa[10010],bb[10010];//以字符串的形式输入
int a[10010],b[10010],c[10010];
int main()
{
    int t,k=1;
    scanf("%d",&t);
    while(t--)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        scanf("%s%s",aa,bb);
        int la=strlen(aa);
        int lb=strlen(bb);
        int j=0;
        for(int i=la-1; i>=0; i--)//倒着存到数组a中
            a[j++]=aa[i]-'0';
        j=0;
        for(int i=lb-1; i>=0; i--)//倒着存到数组b中
            b[j++]=bb[i]-'0';
        int lc=max(la,lb),p=0,r=0;看看两个字符串那个长,当做数组c的长度
        for(int i=0; i1&&c[lc-1]==0)//如果相加前面有0,则去掉,在这道题中这种情况不会出现,下面就有可能出现
            lc--;
        printf("Case %d:\n",k++);
        printf("%s + ",aa);
        printf("%s = ",bb);
        for(int i=lc-1; i>=0; i--)
            printf("%d",c[i]);
         printf("\n");
        if(t)
            printf("\n");
    }
}

正数加法:http://acm.hdu.edu.cn/showproblem.php?pid=1753

这道题和上面的方法差不多。只是把小数部分和整数部分分开算,然后组装起来就好

代码如下:

#include
#include
#include
using namespace std;
char aa[410],bb[410];
int a[410],b[410],c[410],d[410];
int s1[410],s2[410];
int main()
{
    while(~scanf("%s%s",aa,bb))
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        memset(d,0,sizeof(d));
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        int laa=strlen(aa),lbb=strlen(bb);
        int k=0,l=0,la=laa,lb=lbb,i,j;
        for(i=0; i=0; i--)
            a[j++]=aa[i]-'0';
        for(i=la+1,j=0; i=0; i--)
            c[j++]=bb[i]-'0';
        for(i=lb+1,j=0; i=0; i--)
        {
            q=b[i]+d[i]+r;
            r=q/10;
            s2[i]=q%10;
        }
        k=max(la,lb);
        for(i=0; i=0;i--)
        {
            if(s2[i]==0)
                l--;
            else
                break;
        }
        for(i=k-1; i>=0; i--)
            printf("%d",s1[i]);
        if(l!=0)
        {
            printf(".");
            for(i=0; i

整数加法(可以是负数):https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1005

这道题和上面的做法有些不同,这道题是把负数的每一位变为负数和另一个数相加减,然后再每一位加10或是减10.

代码如下:

#include
#include
#include
#include
#include
#include
using namespace std;
int a[10010],b[10010];
char aa[10010],bb[10010];
int sum[10010];
void init()
{
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(sum,0,sizeof(sum));
}
int main()
{
    init();
    scanf("%s%s",aa,bb);
    int len1=strlen(aa),len2=strlen(bb);
    int k=0,h=0;
    if(aa[0]=='-')
    {
        for(int j=len1-1; j>0; j--)
            a[k++]=-(aa[j]-'0');
    }
    else
    {
        for(int j=len1-1; j>=0; j--)
            a[k++]=aa[j]-'0';
    }
    if(bb[0]=='-')
    {
        for(int j=len2-1; j>0; j--)
            b[h++]=-(bb[j]-'0');
    }
    else
    {
        for(int j=len2-1; j>=0; j--)
            b[h++]=bb[j]-'0';
    }
    int maxx=max(k,h);//这里长度应以h,k为基准,因为len1和len2中可能还包含负数的位数
    int temp=0;
    for(int i=0; i0)
            {
                sum[i]-=10;
                sum[i+1]++;
            }
            sum[i]=-sum[i];
        }
        printf("-");
    }
    else
    {
        for(int i=0; i=0; i--)
        printf("%d",sum[i]);
    printf("\n");
    return 0;
}

这里我再添加一种简单的方法,是用另一种语言写的

#11111111
a=input()
b=input()
c=int(a)+int(b)
print(c)

 

你可能感兴趣的:(大数)