Exponentiation POJ-1001

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

 //10000000   100000 

 #include<iostream>
 #include<cstring>
 using namespace std;

 ],tts[];                            /*用于处理输入,删去点,签到0,点后0,统计小数点后数的个数保存至origu */
 ],ans[],t_ans[];        // t_ans存乘法运算的中间过程
 int b,u,origu,BITS,origBITS;

 void my_pow(int x){
     )
         return ;

     my_pow(x/);
     //接下来ans*ans
     memset(t_ans,,sizeof(t_ans));
     ;i>=;i--){       //模拟乘法
         -i;            /*tpos即 这次乘的结果存在t_ans哪一位 ,注意ans是高位在前, t_ans是高位在后的 */
         ;j>=;j--){
             t_ans[tpos]+=ans[j]*ans[i];
             ){            /*进位,   这个进位应该进一位就可以了,没有必要再向前推了,因为某一位算出来的最大也到不了100(?) */
                 t_ans[tpos+]+=t_ans[tpos]/;
                 t_ans[tpos]%=;
             }
             tpos++;
         }
     }

     ;   //   统计 2500-t_ans的位数
     -;i>=;i--)
         )
             _BITS++;
         else
             break;
     BITS=-_BITS;    //更新BITS  

     ,j=;i>=;i--)            //高位在前存到ans里去
         ans[j++]=t_ans[i];
     u*=;            //因为是自己×自己    所以小数点后数字个数增加一倍 

     ){                        //如果^b的b是奇数,还得再×一下初始的数即orig
         //ans*orig

         memset(t_ans,,sizeof(t_ans));

         ;i>=;i--){
             -i;
             ;j>=;j--){
                 t_ans[tpos]+=ans[j]*orig[i];
                 ){
                     t_ans[tpos+]+=t_ans[tpos]/;
                     t_ans[tpos]%=;
                 }
                 tpos++;
             }
         }

         _BITS=;
         -;i>=;i--)
             )
                 _BITS++;
             else
                 break;
         BITS=-_BITS;  

         ,j=;i>=;i--)
             ans[j++]=t_ans[i];
         u=u+origu;
     }

 }

 void _print(){
     if(u<BITS){
         ;
         ;i>=BITS-u;i--){
             )
                 _del++;
             else
                 break;
         }
         BITS-=_del;
         u-=_del;
         ;i<BITS-u;i++)
             printf("%d",ans[i]);
         if(u){
             printf(".");
             for(int i=BITS-u;i<BITS;i++)
                 printf("%d",ans[i]);
         }
         printf("\n");
     }
     else{
         ;
         ;i>=;i--){
             )
                 _del++;
             else
                 break;
         }
         BITS-=_del;
         u-=_del;
         printf(".");
         ;i<u-BITS;i++)
             printf(");
         ;i<BITS;i++)
             printf("%d",ans[i]);
         printf("\n");
     }
 }

 int main(){
     ){

         u=;

         ;                                                    //删点后0
         ;i>=;i--)
             ')
                 ts[i]='\0';
             else
                 fg=;

         ;i>=;i--)            //删点,统计点后数个数u  origu
             if(ts[i]!='.')
                 u++;
             else
                 break;
         origu=u;

         ;ts[i]!='\0';i++)            // 删点,点后前移
             ts[i]=ts[i+];        

         memset(tts,,sizeof(tts));                    //删前导0
         ;
         fg=;
         ;ts[i]!='\0';i++)
             '&&fg)
                 pos++;
             else
                 fg=;
         ;ts[i]!='\0';i++)
             tts[j++]=ts[i];

         BITS=origBITS=;
         memset(ans,-,sizeof(ans));
         memset(orig,-,sizeof(orig));
         ;tts[i]!='\0';i++){                //转到int数组
             ans[i]=orig[i]=(');
             origBITS++;BITS++;
         }

         my_pow(b);                    //快速幂
         _print();                    //输出
     }
     ;
 } 

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

上一篇:{03--CSS布局设置} 盒模型 二 padding bode margin 标准文档流 块级元素和行内元素 浮动 margin的用法 文本属性和字体属性 超链接导航栏 background 定位 z-index


下一篇:maven下载的jar文件出现invalid LOC header (bad signature)