zoukankan      html  css  js  c++  java
  • hdu 1753 大明A+B(大数)

    题意:小数大数加法

    思路:大数模板

    #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("
    ");
    }
    
    int main(){
        char a[1024],b[1024];
        while(~scanf("%s%s",a,b))
            plu(a,b);
        return 0;
    }
    View Code
  • 相关阅读:
    [学]寻找mysql高并发解决方案(事务,行锁,事务隔离级别)
    [学]MYSQL中replace into的用法
    Dynamics CRM OData方式进行增删改查时报错的问题
    Get Form type using javascript in CRM 2011
    Dynamics CRM 同一实体多个Form显示不同的Ribbon按钮
    java中throw与throws
    Dynamics CRM 通过OData查询数据URI中包含中文的情况
    我是怎样阅读技术论文的
    Dynamics CRM2013/2015 禁止欢迎界面(Disable the Welcome Screen)
    社会化网络分析
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4729450.html
Copyright © 2011-2022 走看看