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过了
原文地址:https://www.cnblogs.com/spzeno/p/10661484.html
时间: 2024-10-23 08:50:31