现在的位置: 首页 > 综合 > 正文

大数乘以整形数nyoj 155

2014年08月29日 ⁄ 综合 ⁄ 共 1586字 ⁄ 字号 评论关闭

求高精度幂

时间限制:3000 ms  |  内存限制:65535 KB
难度:2
描述

对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 

现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R  n 次方(Rn),其中是整数并且 0
< =n <= 25

输入
输入有多行,每行有两个数R和n,空格分开。R的数字位数不超过10位。
输出
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
样例输入
95.123 120.4321 205.1234 156.7592  998.999 101.0100 12
样例输出
548815620517731830194541.899025343415715973535967221869852721.0000000514855464107695612199451127676715483848176020072635120383542976301346240143992025569.92857370126648804114665499331870370751166629547672049395302429448126.76412102161816443020690903717327667290429072743629540498.1075960194566517745610440100011.126825030131969720661201

来源

一道大数题目:

大数乘以整形数。注意其中的变化。

#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
string Multiply(string s,long x)  //大数乘以整形数
{
    reverse(s.begin(),s.end());
    long cmp=0;
    for(int i=0; i<s.size(); i++)
    {
        cmp=(s[i]-'0')*x+cmp;
        s[i]=(cmp%10+'0');
        cmp/=10;
    }
    while(cmp)
    {
        s+=(cmp%10+'0');
        cmp/=10;
    }
    reverse(s.begin(),s.end());
    return s;
}
string Remove_later(string s)   //删除一个字符串的后倒0
{
    for(int i=s.size()-1; i>=0; i--)
    {
        if(s[i]=='0'&&s[i]!='.')
            s.erase(i);
        else
            break;
    }
    return s;
}
int main()
{
    string s;
    int n;
    while(cin>>s>>n)
    {
        if(n==0)
        {
            printf("1\n");continue;
        }
        string cmp="";
        long x=0,point=0;
        for(int i=0; i<s.size(); i++)
            if(s[i]!='.')
            {
                cmp+=s[i];
                x=x*10+(s[i]-'0');
            }
            else
                point=s.size()-1-i;
        for(int i=1; i<n; i++)
        {
            cmp=Multiply(cmp,x);
        }
        int ans_point=cmp.size()-n*point;
        if(ans_point<0)
         {
             printf(".");
             for(int i=ans_point;i!=0;i++)
                printf("0");
         }
        string::iterator it=cmp.begin();
        if(ans_point>=0&&ans_point<cmp.size())
            cmp.insert(it+ans_point,'.');
        cout<<Remove_later(cmp)<<endl;
    }
    return 0;
}

抱歉!评论已关闭.