51nod 1873 高精度计算

Posted kimsimple

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1873 高精度计算相关的知识,希望对你有一定的参考价值。

 

 

JAVA BigDecimal

import java.util.*;
import java.math.*;

public class Main {

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        String str = cin.next();
        int n = cin.nextInt();
        BigDecimal res = new BigDecimal(1);
        final BigDecimal bd = new BigDecimal(str);
        for(int i = 0; i < n; ++i){
            res = res.multiply(bd);
        }
        str = res.stripTrailingZeros().toPlainString();
        System.out.println(str.startsWith("0.") ? str.substring(1) : str);
    }
}

 

C++

#include<bits/stdc++.h>  
using namespace std;  
  
string multi(string a,string b)  
{  
    int i,j,arr[200],len=a.length()+b.length();  
    memset(arr,0,sizeof(arr));  
    reverse(a.begin(),a.end());  
    reverse(b.begin(),b.end());  
    for(i=0;i<a.length();i++)  
    {  
        for(j=0;j<b.length();j++)  
        {  
            arr[i+j]+=(a[i]-\'0\')*(b[j]-\'0\');  
        }  
    }  
    for(i=0;i<len;i++)  
    {  
        arr[i+1]+=arr[i]/10;  
        arr[i]%=10;  
    }  
    string ret=string(len,\'0\');  
    for(i=0;i<len;i++)  
        ret[i]+=arr[i];  
    reverse(ret.begin(),ret.end());  
    return ret;   
}  
  
string strpow(string x,int p)  
{  
    string ret="1";  
    while(p)  
    {  
        if(p&1)  
            ret=multi(ret,x);  
        x=multi(x,x);  
        p>>=1;   
    }  
    return ret;  
}  
  
int main()  
{  
    string a;  
    int n,i,index;  
    while(cin>>a>>n)  
    {  
        index=a.find(\'.\');  
        if(index==-1)  
            index=0;  
        else  
        {  
            a=a.substr(0,index)+a.substr(index+1);  
            index=(a.length()-index)*n;  
        }  
        a=strpow(a,n);  
        a=a.substr(0,a.length()-index)+"."+a.substr(a.length()-index);  
        for(i=0;i<a.length();i++)  
        {  
            if(a[i]!=\'0\')  
                break;  
        }  
        a=a.substr(i);  
        for(i=a.length()-1;i>=0;i--)  
        {  
            if(a[i]==\'.\')  
            {  
                a=a.substr(0,i);  
                break;  
            }  
            else if(a[i]!=\'0\')  
            {  
                a=a.substr(0,i+1);  
                break;  
            }  
        }  
        cout<<a<<endl;  
    }  
}  

 

 

追求效率?开发时间

追求性能?运行时间、消耗内存

 

以上是关于51nod 1873 高精度计算的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1873 初中的算术

51Nod 1873 初中的算术

初中的算数(高精度)

51nod算法马拉松28-a

51nod1185(wythoff+高精度)

51nod1061 最复杂的数 V2