【高精度】Vijos P1010 清帝之惑之乾隆

来源:互联网 发布:沪江英语网络课程如何 编辑:程序博客网 时间:2024/04/28 17:00
题目链接:

  https://vijos.org/p/1010

题目大意

  多组数据,求R的n次幂(R为不超过9999.9的小数 n<=200)R保证占6位

  不输出前导0和后缀0,整数就只输出整数部分

题目思路:

  【高精度】

  直接用double算是肯定不行的。毕竟精度要求那么高。

  做法是先记下最终要输出的小数位数,然后把这个小数放大到6位,接下来算个高精度的幂之后处理一下输出就行了

 

////by coolxxx//#include<iostream>#include<algorithm>#include<string>#include<iomanip>#include<memory.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdbool.h>#include<math.h>#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))#define lowbit(a) (a&(-a))#define sqr(a) (a)*(a)#define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)#define eps 1e-8#define MAX 0x7f7f7f7f#define J 10#define PI 3.1415926535897#define N 1504using namespace std;int n,m,lll,ans,cas;char s[10];int a[N];void gjdchengdjd(){int i;a[0]+=6;for(i=1;i<=a[0];i++)a[i]*=ans;for(i=1;i<=a[0];i++){a[i+1]+=a[i]/J;a[i]%=J;}while(a[a[0]+1])a[0]++;while(!a[a[0]])a[0]--;}int main(){#ifndef ONLINE_JUDGE//  freopen("1.txt","r",stdin);//  freopen("2.txt","w",stdout);#endifint i,j,k;while(~scanf("%s%d",s,&n)){memset(a,0,sizeof(a));ans=0;for(i=0;i<6;i++){if(s[i]!='.')ans=ans*10+s[i]-'0';else lll=5-i;}lll*=n;if(n==0){puts("1");continue;}a[0]=a[1]=1;for(i=1;i<=n;i++)gjdchengdjd();for(i=1;i<=lll;i++)if(a[i]==0)a[i]=-1;else break;if(a[0]>lll){for(i=a[0];i>lll && a[i]==0;i--);for(;i>lll;i--)printf("%d",a[i]);if(a[lll]!=-1){printf(".");for(i=lll;i && a[i]!=-1;i--)printf("%d",a[i]);}}else{printf(".");for(i=lll;i>a[0];i--)printf("0");for(i=a[0];i && a[i]!=-1;i--)printf("%d",a[i]);}puts("");}return 0;}/*////*/


0 0