Exponentiation POJ-1001
Posted spzeno
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(" "); 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(" "); 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]=‘