poj 1001 求高精度幂
2016-09-06 00:12
190 查看
这一题应该算是非常基础的高精度模板题了,但是由于我之前没有做过类似的题目,所以这题还是花了不少时间。
关键是输入的顺序跟实际计算的顺序是相反的,这就容易出错,还有就是输入可能会有带无意义的“0”的情况,所以还得把这些零处理掉,比如输入“3.000”,此处的“0”跟小数点都是没有意义的,最后的结果不能够输出来,我看网上的题解都是最后在处理这些零的,但我是在输入的时候就把这些零处理掉了,因为我发现,在计算幂的时候不会再有无意义的零出现了,刚开始处理好把小数点去掉,只记下小数点的位置就行了,当成整数计算就行了,最后在合适的位置输出就行了。
关键是输入的顺序跟实际计算的顺序是相反的,这就容易出错,还有就是输入可能会有带无意义的“0”的情况,所以还得把这些零处理掉,比如输入“3.000”,此处的“0”跟小数点都是没有意义的,最后的结果不能够输出来,我看网上的题解都是最后在处理这些零的,但我是在输入的时候就把这些零处理掉了,因为我发现,在计算幂的时候不会再有无意义的零出现了,刚开始处理好把小数点去掉,只记下小数点的位置就行了,当成整数计算就行了,最后在合适的位置输出就行了。
#include<stdio.h> #include<string.h> #include<math.h> #include <iostream> #include <algorithm> using namespace std; const int INF = 0x7fffffff; const int N=-0xfffffff; const int Maxsize=1000; char str1[Maxsize]; int point=0,len; int zeropoint; int function1(int temp[],int results[]) { point=0; len=strlen(str1); int flag=1; zeropoint=0; for(int i=0;i<len;i++) { if(str1[i]=='.') { zeropoint=1; } } if(zeropoint) for(int i=len-1;i>=0;i--) { if(flag&&str1[i]=='0') len--; else { if(str1[i]=='.') break; flag=0; point++; } } if(zeropoint) { for(int i=len-point-1;i>0;i--) { str1[i]=str1[i-1]; } len--; } else { for(int i=len;i>=0;i--) { str1[i]=str1[i-1]; } } for(int i=len;i>0;i--) { temp[len-i+1]=str1[i]-'0'; } for(int i=len;i>=1;i--) { if(temp[i]==0) { len--; } else break; } for(int i=1;i<=len;i++) results[i]=temp[i]; // for(int i=1;i<=len;i++) // cout<<temp[i]; // cout<<endl; return 0; } int mul(int temp[],int times,int results[]) { // cout<<times<<endl; int len2=times*len+5; while(!results[len2]) len2--; // cout<<len2<<endl; int nc[Maxsize]={0}; for(int i=1;i<=len;i++) { for(int j=1;j<=len2;j++) { nc[i+j-1]+=results[j]*temp[i]; } } for(int i=1;i<=len+len2;i++) { nc[i+1]+=nc[i]/10; nc[i]%=10; } int sizes=len+len2; if(!nc[sizes]) sizes--; for(int i=1;i<=sizes;i++) results[i]=nc[i]; return 0; } int main() { cin.tie(0); cin.sync_with_stdio(false); // freopen("in.txt","r",stdin); int n; while(cin>>str1>>n) { int times; int lens=strlen(str1); int signs=0; for(int i=0;i<lens;i++) { if(str1[i]=='0'||str1[i]=='.') signs=0; else { signs=1; break; } } if(!signs) { cout<<0<<endl; continue; } int results[Maxsize]={0}; int temp[Maxsize]={0}; function1(temp,results); for(times=1;times<=n-1;times++) mul(temp,times,results); int maxsizes=len*n; int pointsize=n*point; while(!results[maxsizes]) maxsizes--; // cout<<maxsizes<<endl; if(pointsize<maxsizes) { for(int i=maxsizes;i>=1;i--) { if(i==pointsize) cout<<'.'; cout<<results[i]; } } else { cout<<'.'; for(int i=pointsize;i>=1;i--) { if(i<=maxsizes) cout<<results[i]; else cout<<'0'; } } cout<<endl; } return 0; }
相关文章推荐
- poj 1001 Exponentiation 高精度乘法
- poj 1001 求高精度幂
- poj 1001 Exponentiation 高精度乘方
- poj 1001 Exponentiation(高精度运算)
- POJ 1001 (坑爹的小数高精度乘法)
- POJ 1001 Exponentiation【高精度用java】
- POJ1001 Exponentiation--浮点数的高精度乘法
- POJ 1001 求高精度幂
- poj1001 Exponentiation --高精度
- POJ 1001:Exponentiation —— 高精度浮点数运算
- POJ 1001 Exponentiation 高精度
- poj-1001 高精度幂
- POJ 1001 求高精度幂
- poj 1001 求高精度幂
- poj 1001(高精度)
- POJ 1001 解题报告 高精度大整数乘法模版
- Exponentiation - POJ 1001 高精度
- POJ 1001 解题报告 高精度大整数乘法模版
- POJ1001《Exponentiation》方法:模拟 高精度
- POJ1001:高精度运算程序(X)