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过了