• FZU 2032 高精度小数加法


    题目描写很没意思..就是说给出n个小数 求它们的总和

    因为给出的小数点后最多16位而要求保存至12位 而能直接使用的最精确的double只能到12位 于是13的进位可能被忽略 于是不可以用double

    于是它就是一个很裸的小数高精度加法..还只是加法..

    在比赛的时候学长很快就敲出来了代码并且AC 但是被别人极多提交的极短且超时代码唬住(猜测应该是直接相加) 以为直接相加的O(N)的复杂度尚且不可..所以甚至连试做都没有 

    赛后写出代码F9直接运行 但是小数上的进位转到整数上遗漏 更改后AC 

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    #include<map>
    using namespace std;
    int aq[300];
    int bq[300];
    int aw[300];
    int bw[300];
    char s[300];
    int main() {
        int n;
        while(scanf("%d",&n)!=EOF) {
            memset(bq,0,sizeof(bq));
            memset(bw,0,sizeof(bw));
            for(int j=0; j<n; j++) {
                memset(aq,0,sizeof(aq));
                memset(aw,0,sizeof(aw));
                scanf("%s",s);
                int p=strlen(s);
                int len=p;
                int ge=0;
                for(int i=0; i<p; i++) {
                    if(s[i]=='.') {
                        p=i;
                        break;
                    }
                }
                int w=0;
                for(int i=p+1; i<len; i++) {
                    aw[w++]=(s[i]-'0');
                }
                int ww=0;
                for(int i=p-1; i>=0; i--) {
                    aq[ww++]=(s[i]-'0');
                }
                int jin=0;
                for(int i=w-1; i>=0; i--) {
                    bw[i]+=aw[i];
                    bw[i]+=jin;
                    jin=bw[i]/10;
                    bw[i]%=10;
                }
                for(int i=0; i<ww; i++) {
                    bq[i]+=aq[i];
                    bq[i]+=jin;
                    jin=bq[i]/10;
                    bq[i]%=10;
                }
                int where=ww;
                while(jin!=0) {
                    bq[where]+=jin;
                    jin=bq[where]/10;
                    bq[where]%=10;
                    where++;
                }
    
            }
            int jin=0;
            if(bw[12]>=5) {
                jin=1;
                for(int i=11; i>=0; i--) {
                    bw[i]+=jin;
                    jin=bw[i]/10;
                    bw[i]%=10;
                    if(jin==0)
                        break;
                }
                if(jin!=0) {
                    for(int i=0;; i++) {
                        bq[i]+=jin;
                        jin=bq[i]/10;
                        bq[i]%=10;
                        if(jin==0)
                            break;
                    }
                }
            }
            int ok=true;
            for(int i=270; i>=0; i--) {
                if(bq[i]!=0)
                    ok=false;
                if(ok)
                    continue;
                printf("%d",bq[i]);
            }
            if(ok)
                printf("0");
            printf(".");
            for(int i=0; i<12; i++)
                printf("%d",bw[i]);
            printf("
    ");
        }
    }
    

      

  • 相关阅读:
    Scramble String
    Burst Balloons
    Coins in a Line III
    maven初识
    Java类加载器初识
    HTTP协议
    Map和Set的联系
    Thread类与Runnable接口
    Throwable和Exception的区别
    SpringMVC的@ResponseBody注解简介
  • 原文地址:https://www.cnblogs.com/rayrayrainrain/p/5366096.html
Copyright © 2020-2023  润新知