【高精度】Vijos P1010 清帝之惑之乾隆
题目链接:
题目大意:
多组数据,求R的n次幂(R为不超过9999.9的小数 n<=200)R保证占6位
不输出前导0和后缀0,整数就只输出整数部分
题目思路:
【高精度】
直接用double算是肯定不行的。毕竟精度要求那么高。
做法是先记下最终要输出的小数位数,然后把这个小数放大到6位,接下来算个高精度的幂之后处理一下输出就行了
1 // 2 //by coolxxx 3 // 4 #include<iostream> 5 #include<algorithm> 6 #include<string> 7 #include<iomanip> 8 #include<memory.h> 9 #include<time.h> 10 #include<stdio.h> 11 #include<stdlib.h> 12 #include<string.h> 13 #include<stdbool.h> 14 #include<math.h> 15 #define min(a,b) ((a)<(b)?(a):(b)) 16 #define max(a,b) ((a)>(b)?(a):(b)) 17 #define abs(a) ((a)>0?(a):(-(a))) 18 #define lowbit(a) (a&(-a)) 19 #define sqr(a) (a)*(a) 20 #define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b) 21 #define eps 1e-8 22 #define MAX 0x7f7f7f7f 23 #define J 10 24 #define PI 3.1415926535897 25 #define N 1504 26 using namespace std; 27 int n,m,lll,ans,cas; 28 char s[10]; 29 int a[N]; 30 void gjdchengdjd() 31 { 32 int i; 33 a[0]+=6; 34 for(i=1;i<=a[0];i++) 35 a[i]*=ans; 36 for(i=1;i<=a[0];i++) 37 { 38 a[i+1]+=a[i]/J; 39 a[i]%=J; 40 } 41 while(a[a[0]+1])a[0]++; 42 while(!a[a[0]])a[0]--; 43 } 44 int main() 45 { 46 #ifndef ONLINE_JUDGE 47 // freopen("1.txt","r",stdin); 48 // freopen("2.txt","w",stdout); 49 #endif 50 int i,j,k; 51 while(~scanf("%s%d",s,&n)) 52 { 53 memset(a,0,sizeof(a)); 54 ans=0; 55 for(i=0;i<6;i++) 56 { 57 if(s[i]!='.') 58 ans=ans*10+s[i]-'0'; 59 else lll=5-i; 60 } 61 lll*=n; 62 if(n==0) 63 { 64 puts("1"); 65 continue; 66 } 67 a[0]=a[1]=1; 68 for(i=1;i<=n;i++) 69 gjdchengdjd(); 70 for(i=1;i<=lll;i++) 71 if(a[i]==0)a[i]=-1; 72 else break; 73 if(a[0]>lll) 74 { 75 for(i=a[0];i>lll && a[i]==0;i--); 76 for(;i>lll;i--) 77 printf("%d",a[i]); 78 if(a[lll]!=-1) 79 { 80 printf("."); 81 for(i=lll;i && a[i]!=-1;i--) 82 printf("%d",a[i]); 83 } 84 } 85 else 86 { 87 printf("."); 88 for(i=lll;i>a[0];i--) 89 printf("0"); 90 for(i=a[0];i && a[i]!=-1;i--) 91 printf("%d",a[i]); 92 } 93 puts(""); 94 } 95 return 0; 96 } 97 98 99 /* 100 // 101 102 // 103 */