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

题目链接:

  https://vijos.org/p/1010

题目大意

  多组数据,求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 */
View Code

 

posted @ 2016-04-02 19:45  Cool639zhu  阅读(335)  评论(0编辑  收藏  举报