Exponentiation POJ-1001

http://poj.org/problem?id=1001

  1 //10000000   100000 
  2 
  3 #include<iostream>
  4 #include<cstring>
  5 using namespace std;
  6 
  7 char ts[7],tts[7];                            //用于处理输入,删去点,签到0,点后0,统计小数点后数的个数保存至origu 
  8 short orig[7],ans[2500],t_ans[2500];        // t_ans存乘法运算的中间过程 
  9 int b,u,origu,BITS,origBITS;
 10 
 11 void my_pow(int x){
 12     if(x==1)
 13         return ;
 14     
 15     
 16     my_pow(x/2);
 17     //接下来ans*ans
 18     memset(t_ans,0,sizeof(t_ans));
 19     for(int i=BITS-1;i>=0;i--){       //模拟乘法 
 20         int tpos=BITS-1-i;            //tpos即 这次乘的结果存在t_ans哪一位 ,注意ans是高位在前, t_ans是高位在后的 
 21         for(int j=BITS-1;j>=0;j--){
 22             t_ans[tpos]+=ans[j]*ans[i];
 23             if(t_ans[tpos]>9){            //进位,   这个进位应该进一位就可以了,没有必要再向前推了,因为某一位算出来的最大也到不了100(?) 
 24                 t_ans[tpos+1]+=t_ans[tpos]/10;
 25                 t_ans[tpos]%=10;
 26             }
 27             tpos++; 
 28         }
 29     }
 30     
 31     int _BITS=0;   //   统计 2500-t_ans的位数 
 32     for(int i=2500-1;i>=0;i--)
 33         if(t_ans[i]==0)
 34             _BITS++;
 35         else
 36             break;
 37     BITS=2500-_BITS;    //更新BITS  
 38        
 39     for(int i=BITS-1,j=0;i>=0;i--)            //高位在前存到ans里去 
 40         ans[j++]=t_ans[i];
 41     u*=2;            //因为是自己×自己    所以小数点后数字个数增加一倍 
 42     
 43     
 44     if(x%2){                        //如果^b的b是奇数,还得再×一下初始的数即orig 
 45         //ans*orig
 46         
 47         memset(t_ans,0,sizeof(t_ans));
 48         
 49         for(int i=origBITS-1;i>=0;i--){
 50             int tpos=origBITS-1-i;
 51             for(int j=BITS-1;j>=0;j--){
 52                 t_ans[tpos]+=ans[j]*orig[i];
 53                 if(t_ans[tpos]>9){             
 54                     t_ans[tpos+1]+=t_ans[tpos]/10;
 55                     t_ans[tpos]%=10;
 56                 }
 57                 tpos++;
 58             }
 59         }
 60         
 61         _BITS=0;
 62         for(int i=2500-1;i>=0;i--)
 63             if(t_ans[i]==0)
 64                 _BITS++;
 65             else
 66                 break;
 67         BITS=2500-_BITS;  
 68         
 69         for(int i=BITS-1,j=0;i>=0;i--)
 70             ans[j++]=t_ans[i];
 71         u=u+origu;
 72     }
 73         
 74 }
 75 
 76 void _print(){
 77     if(u<BITS){
 78         int _del=0;
 79         for(int i=BITS-1;i>=BITS-u;i--){
 80             if(ans[i]==0)
 81                 _del++;
 82             else
 83                 break;
 84         }
 85         BITS-=_del;
 86         u-=_del;
 87         for(int i=0;i<BITS-u;i++)
 88             printf("%d",ans[i]);
 89         if(u){
 90             printf(".");
 91             for(int i=BITS-u;i<BITS;i++)
 92                 printf("%d",ans[i]);    
 93         }
 94         printf("\n");
 95     }
 96     else{
 97         int _del=0;
 98         for(int i=BITS-1;i>=0;i--){
 99             if(ans[i]==0)
100                 _del++;
101             else
102                 break;
103         }
104         BITS-=_del;
105         u-=_del;
106         printf(".");
107         for(int i=0;i<u-BITS;i++)    
108             printf("0");
109         for(int i=0;i<BITS;i++)
110             printf("%d",ans[i]);
111         printf("\n");
112     }
113 }
114 
115 int main(){
116     while(scanf("%s%d",ts,&b)==2){
117         
118         u=0;
119         
120         bool fg=1;                                                    //删点后0 
121         for(int i=5;i>=0;i--)
122             if(fg&&ts[i]=='0')
123                 ts[i]='\0';
124             else
125                 fg=0;
126                 
127                 
128         for(int i=strlen(ts)-1;i>=0;i--)            //删点,统计点后数个数u  origu 
129             if(ts[i]!='.')
130                 u++;
131             else
132                 break;
133         origu=u;
134                 
135                 
136         for(int i=strlen(ts)-u-1;ts[i]!='\0';i++)            // 删点,点后前移 
137             ts[i]=ts[i+1];        
138         
139         
140         memset(tts,0,sizeof(tts));                    //删前导0 
141         int pos=0;
142         fg=1;
143         for(int i=0;ts[i]!='\0';i++)
144             if(ts[i]=='0'&&fg)
145                 pos++;
146             else
147                 fg=0;
148         for(int i=pos,j=0;ts[i]!='\0';i++)
149             tts[j++]=ts[i];
150             
151         BITS=origBITS=0;
152         memset(ans,-1,sizeof(ans));       
153         memset(orig,-1,sizeof(orig));
154         for(int i=0;tts[i]!='\0';i++){                //转到int数组
155             ans[i]=orig[i]=(int)(tts[i]-'0');
156             origBITS++;BITS++;
157         }
158                     
159         my_pow(b);                    //快速幂 
160         _print();                    //输出 
161     }
162     return 0;
163 } 

但是杭电这道同样的过不了,据说杭电会有00000.这样的测试数据?但是0能记成这种记法吗?还有人家明明说了R>0.0   ,   n>0为什么还非得找R=0N=0的特例啊,不管了,反正俺poj过了

猜你喜欢

转载自www.cnblogs.com/spzeno/p/10661484.html