Try Again

51Nod 1873 初中的算术

Noder现在上初三了,正在开始复习中考。他每天要计算型如 (a× a× a× × a)na 的式子。 其中 0.0<a<99.999,0<n<26 。

虽然Noder会计算,但是老是算错,现在他想要你来写一个程序输出正确的结果,以便他核对。

 

Input
单组测试数据。
第一行有一个实数a和一个整数n,中间用空格分开。 0.0 < a < 99.999,a总是占6位(a长度<=6),0<n<26。
Output
输出一个实数表示结果,不要输出前导0,后面多余的0也不要输出,如果是整数不要输出小数点。
Input示例
样例输入1
0.4321 20
样例输入2
1.0100 12
Output示例
样例输出1
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
样例输出2
1.126825030131969720661201
高精度模拟,只是后面的小数保留有点麻烦
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 0x3f3f3f3f
#define mem(a) ((a,0,sizeof(a)))
typedef long long ll;
string ss,s="";
int pos,n;
string multiply(string a,string b)
{
    string res="";
    int num[1006];
    memset(num,0,sizeof(num));
    int len_a=a.size(),len_b=b.size();
    for(int i=0;i<len_a;i++)
        for(int j=0;j<len_b;j++)
            num[i+j]+=(a[i]-'0')*(b[j]-'0');
    for(int i=1;i<=len_a+len_b;i++)
    {
        num[i]+=num[i-1]/10;
        num[i-1]%=10;
    }
    int i;
    for(i=len_a+len_b;i>=0;i--)
        if(num[i]) break;
    for(int j=0;j<=i;j++)
        res+=num[j]+'0';
    return res;
}
void solve(string s,int n)
{
    reverse(s.begin(),s.end());
    string res="1";
    while(n)
    {
        if(n&1) res=multiply(res,s);
        n>>=1;
        s=multiply(s,s);
    }
    int len=res.size();
    for(int i=len;i<=1003;i++)
        res+='0';
    int i,j;
    for(i=1000;i>=pos;i--)
        if(res[i]!='0') break;
    for(j=0;j<pos;j++)
        if(res[j]!='0') break;
    if(j>i) printf("0\n");
    else
    {
        for(int l=i;l>=max(0,pos);l--)
            printf("%c",res[l]);
        if(j<pos && res[j]!='0') printf(".");
        for(int r=pos-1;r>=max(j,0);r--)
            printf("%c",res[r]);
        printf("\n");
    }
}
int main()
{
    cin>>ss>>n;
    pos=ss.find('.');
    if(pos!=-1) {pos=ss.size()-pos-1;pos*=n;}
    else pos=0;
    int k=ss.size();
    for(int i=0;i<k;i++)
        if(ss[i]!='.') s+=ss[i];
    solve(s,n);
    return 0;
}

 

posted @ 2018-05-01 15:25  十年换你一句好久不见  阅读(175)  评论(0编辑  收藏  举报