登 录
题意:给出R和n,求R的n次方。
思路:大数操作,小数点另外处理。
分为:有小数点和无小数点。有小数点的数,判断小数点后面的个数与当前所求的数的位数的关系。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char a[8]; int result[26][1000],num[8],n; bool flag; void solve(int len,int code) { int i,j,k; memset(result,0,sizeof(result)); for(i=0;i<=len;i++) result[1][i]=num[i]; for(k=2;k<=n;k++) { for(i=0;i<=900;i++) for(j=0;j<=len;j++) result[k][i+j]+=result[k-1][i]*num[j]; for(i=0;i<999;i++) if(result[k][i]>9) { result[k][i+1]+=result[k][i]/10; result[k][i]%=10; } } if(flag) { int point=code*n; j=999; while(result[n][j]==0&&j>=0) j--; if(j<0) printf("0"); else { k=0; while(result[n][k]==0&&k<999) k++; if(j+1==point) { printf("."); for(i=j;i>=k;i--) printf("%d",result[n][i]); } else if(j+1<point) { printf("."); for(i=j+1;i<point;i++) printf("0"); for(i=j;i>=k;i--) printf("%d",result[n][i]); } else { for(i=j;i>=point;i--) printf("%d",result[n][i]); if(k+1>=point) for(i=point-1;i>=k;i--) printf("%d",result[n][i]); else { printf("."); for(i=point-1;i>=k;i--) printf("%d",result[n][i]); } } } } else { j=999; while(result[n][j]==0&&j>=0) j--; if(j<0) printf("0"); for(i=j;i>=0;i--) printf("%d",result[n][i]); } printf("/n"); } int main() { int i,j,t; while(scanf("%s%d",&a,&n)==2) { flag=false;j=0;t=0; int l1=strlen(a); for(i=l1-1;i>=0;i--) { if(a[i]=='.') {flag=true;t=l1-i-1;} else num[j++]=a[i]-'0'; } solve(j-1,t); } }
抱歉!评论已关闭.