码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1753 大明A+B(大数)

时间:2015-08-14 13:03:16      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

题意:小数大数加法

思路:大数模板

技术分享
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

void plu(char *a,char *b){//注意存储方式:整数倒着存,小数正着存,看代码需注意
    int i,j,k,lena,lenb,lena1,lena2,lenb1,lenb2,lenc1,lenc2;//len分别对应相应数组的长度
    char a1[1024],a2[1024],b1[1024],b2[1024],c1[1024],c2[1024];//a1、a2为第一个数的整数部分、小数部分
    lena=strlen(a);//b1、b2为第二个数;c1、c2为结果
    lenb=strlen(b);
    //取出第1个数的整数部分、小数部分
    for(i=0;i<lena;++i)
        if(a[i]==.)
            break;
    lena1=i;
    lena2=lena-i-1;
    for(j=i-1,k=0;j>=0;--j)
        a1[k++]=a[j];
    for(j=i+1,k=0;j<lena;++j)
        a2[k++]=a[j];

    //取出第2个数的整数部分、小数部分
    for(i=0;i<lenb;++i)
        if(b[i]==.)
            break;
    lenb1=i;
    lenb2=lenb-i-1;
    for(j=i-1,k=0;j>=0;--j)
        b1[k++]=b[j];
    for(j=i+1,k=0;j<lenb;++j)
        b2[k++]=b[j];

    //开始计算
    int up=0;//进位
    //计算小数部分
    if(lena2>lenb2){
        lenc2=lena2;
        for(i=lena2-1;i>=lenb2;--i)
            c2[i]=a2[i];
        for(;i>=0;--i){
            c2[i]=a2[i]+b2[i]-0+up;
            if(c2[i]>9){
                up=1;
                c2[i]-=10;
            }
            else up=0;
        }
    }
    else{
        lenc2=lenb2;
        for(i=lenb2-1;i>=lena2;--i)
            c2[i]=b2[i];
        for(;i>=0;--i){
            c2[i]=a2[i]+b2[i]-0+up;
            if(c2[i]>9){
                up=1;
                c2[i]-=10;
            }
            else up=0;
        }
    }
    while(c2[lenc2-1]==0&&lenc2>=1)--lenc2;//去除后面多余的0
    //计算整数部分
    if(lena1>lenb1){
        lenc1=lena1;
        for(i=0;i<lenb1;++i){
            c1[i]=a1[i]+b1[i]-0+up;
            if(c1[i]>9){
                up=1;
                c1[i]-=10;
            }
            else up=0;
        }
        for(;i<lena1;++i){
            c1[i]=a1[i]+up;
            if(c1[i]>9){
                up=1;
                c1[i]-=10;
            }
            else up=0;
        }
    }
    else{
        lenc1=lenb1;
        for(i=0;i<lena1;++i){
            c1[i]=a1[i]+b1[i]-0+up;
            if(c1[i]>9){
                up=1;
                c1[i]-=10;
            }
            else up=0;
        }
        for(;i<lenb1;++i){
            c1[i]=b1[i]+up;
            if(c1[i]>9){
                up=1;
                c1[i]-=10;
            }
            else up=0;
        }
    }

    if(up==1)printf("1");//最后有进位

    for(i=lenc1-1;i>=0;--i)
        printf("%c",c1[i]);

    if(lenc2>0){
        printf(".");
        for(i=0;i<lenc2;++i)
            printf("%c",c2[i]);
    }
    printf("\n");
}

int main(){
    char a[1024],b[1024];
    while(~scanf("%s%s",a,b))
        plu(a,b);
    return 0;
}
View Code

 

hdu 1753 大明A+B(大数)

标签:

原文地址:http://www.cnblogs.com/bofengyu/p/4729450.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!