ACM-1001

作者: 歌白梨 | 来源:发表于2017-01-17 19:41 被阅读8次

    高精度大数据计算,这道题很拟真,数据问题做了半天。

    
    //
    //  main.cpp
    //  ACMUsing
    //
    //  Created by Nsamper on 2017/1/4.
    //  Copyright © 2017年 Nsamper. All rights reserved.
    //
    
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <stack>
    #include <string>
    
    //1001
    using namespace std;
    string r;
    string ans;
    int n;
    long pointNum;
    
    string eraseZero(string str) {
        long i;
        pointNum = 0;
        long point = str.length();
        while (str[0] == '0') {
            str.erase(str.begin());
        }
        for (i = 0; i < str.length(); i++) {
            if (str[i] == '.') {
                point = i;//小数点的位置
                break;
            }
        }
        if (point == str.length()) {
            return str;
        }
        for (i = str.length()-1; i > point; i--) {
            if (str[i] != '0') {
                break;
            } else {
                str.erase(str.begin()+i);
                point--;
            }
        }
        return str;
    }
    
    void removePoint() {
        int i = 0;
        for (i = 0; i < r.length(); i++) {
            if (r[i] == '.') {
                pointNum = r.length() - i - 1;//小数的个数
                r.erase(r.begin()+i);
            }
        }
    }
    
    string multify(string a, string b) {
        int i,j;
        int lena,lenb;
        int tmp[1000];
        string tempStr;
        int x,y = 0;
        
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        
        memset(tmp, 0, sizeof(tmp));
        
        lena = (int)a.length();
        lenb = (int)b.length();
        
        for (i = 0; i < lena; i ++) {
            for (j = 0; j < lenb; j ++) {
                x = a[i]-'0';
                y = b[j]-'0';
                tmp[i + j] += x * y;
            }
        }
        for (i = 0; i < lena + lenb - 1; i ++) {
            x = tmp[i] % 10;
            y = tmp[i] / 10;
            tmp[i] = x;
            tmp[i + 1] += y;
        }
        if (y > 0) {
            i++;
        }
        for (j = 0; j < i; j ++) {
            tempStr += tmp[j]+'0';
        }
        reverse(tempStr.begin(), tempStr.end());
        return tempStr;
    }
    
    void work(string a, int len) {
        ans = "1";
        while (len) {
            if (len&1) {
                ans = multify(ans, a);
            }
            a = multify(a, a);
            len >>= 1;
        }
    }
    
    void eraseZeroAndPrint(string str) {
        str = eraseZero(str);
        if (str[str.length()-1] == '.') {
            str.erase(str.length()-1);
        }
        cout<<str<<endl;
    }
    
    int main(){
        int i,j;
        string str;
        while (cin >> r >> n) {
            str = "";
            r = eraseZero(r);
            removePoint();
            for(i=0;i<r.length();i++)
            {
                if(r[i]!='0')
                    break;
            }
            if(i==r.length())
            {
                cout<<0<<endl;
                continue;
            }
            
            work(r, n);
            if (pointNum*n > ans.length()) {
                i = pointNum*n - (int)ans.length();
                str+='.';
                while (i > 0) {
                    str+='0';
                    i--;
                }
                for (j = 0; j < ans.length(); j ++) {
                    str+= ans[j];
                }
            } else {
                for (j = 0; j < ans.length(); j ++) {
                    if (j == ans.length() - pointNum*n) {
                        str+='.';
                    }
                    str+=ans[j];
                }
            }
            eraseZeroAndPrint(str);
        }
        return 0;
    }
    
    
    

    相关文章

      网友评论

          本文标题:ACM-1001

          本文链接:https://www.haomeiwen.com/subject/pmxvbttx.html