高精度大数加法

88 篇文章 0 订阅

带小数点的长高精度型相加

#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
char a[500];
char b[500];
int c[500];
char xa[500];
char za[500];
char xb[500];
char zb[500];
char xc[500];
int temp=0;
int sun=0;
char k[10];
void solvexiao( char x[],char y[])
{
    if(strlen(x)<strlen(y))
        swap(x,y);
    int lena=strlen(x)-1;
    int lenb=strlen(y)-1;

    int i,j;
    for(i=lena;i!=lenb;i--)
    {
        xc[i]=x[i]-'0';
    }
    for(i;i>=0;i--)
        xc[i]=x[i]-'0'+y[i]-'0';
    int tep=0;
    for(int i=lena;i>=1;i--)
    {
        xc[i-1]+=xc[i]/10;
        xc[i]%=10;
    }

    if(xc[0]>=10)
    {
        temp=1;
        xc[0]-=10;
    }
    for(int i=0;i<=lena;i++)
       {
        xc[i]+='0';
        if(xc[i]!='0')
            sun=1;
       }
}
void solveda(char x[],char y[])
{

    if(strlen(x)<strlen(y))
        swap(x,y);
    if(temp)
    x[strlen(x)-1]++;
    int lena=strlen(x)-1;
    int lenb=strlen(y)-1;
    int i,j;
    for( i=lena,j=lenb;j>=0;i--,j--)
    {
        c[i]=x[i]-'0'+y[j]-'0';
    }
    for(i;i>=0;i--)
        c[i]=x[i]-'0';
    int tep=0;
    for(int i=lena;i>=0;i--)
    {
        if(i!=0)
        {
        c[i-1]+=c[i]/10;
        c[i]%=10;
        }
    }
    for(int i=0;i<=lena;i++)
        printf("%d",c[i]);
}
int main()
{
    while(~scanf("%s%s",&a,&b))
    {
    memset(za,0,sizeof(za));
    memset(zb,0,sizeof(zb));
    memset(xa,0,sizeof(xa));
    memset(xb,0,sizeof(xb));
    memset(xc,0,sizeof(xc));
    memset(c,0,sizeof(c));
    memset(k,0,sizeof(k));
    temp=0;
    sun=0;
    int flaga=0;
    int cot=0;
    for(int i=0;i<strlen(a);i++)
    {
        if(a[i]=='.')
        {
            flaga=i+1;
            break;
        }
        za[cot++]=a[i];
    }
    cot=0;
    for(int i =flaga;i<strlen(a);i++)
    {
        xa[cot++]=a[i];
    }
    int flagb=0;
    cot=0;
    for(int i=0;i<strlen(b);i++)
    {
        if(b[i]=='.')
        {
            flagb=i+1;
            break;
        }
        zb[cot++]=b[i];
    }
    cot=0;
    for(int i =flagb;i<strlen(b);i++)
    {
        xb[cot++]=b[i];
    }

    if(flaga!=0&&flagb!=0)
    {
        solvexiao(xa,xb);
    }
    else
    {
        if(flaga!=0&&flagb==0)
             solvexiao(xa,k);
        if(flaga==0&&flagb!=0)
            {solvexiao(k,xb);

            }
    }
    solveda(za,zb);
    if(sun)
    {
        cout<<".";
        int i;
        for( i=strlen(xc)-1;i>=0;i--)
        {
            if(xc[i]!='0')
                break;
        }
        for(int j=0;j<=i;j++)
            cout<<xc[j];
    }
    cout<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值