首页 > 代码库 > UVA - 748 Exponentiation
UVA - 748 Exponentiation
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25197
给定一个浮点数a,求a的n次方的精确值,并且忽略前导0和后面多余的0.
用一个结构体保存浮点数a去掉小数点后的值,同时记录小数的位数,然后用大数乘法,来代替a的n次幂,求出精确值。
#include<cstdio> #include<cstring> struct node { int len; int num[1000]; node() {memset(num,0,sizeof(num));len=0;} //构造函数 每次定义一个结构体变量就自动执行 }; node solve(node x1,node x2) //大数乘法 { int i,j; node x3; for(i=0;i<x1.len;i++) { for(j=0;j<x2.len;j++) { x3.num[i+j]=x1.num[i]*x2.num[j]+x3.num[i+j]; x3.num[i+j+1]=x3.num[i+j+1]+x3.num[i+j]/10; x3.num[i+j]=x3.num[i+j]%10; } } i=x1.len+x2.len; while(!x3.num[i]) i--; x3.len=i+1; //注意要确定乘出来之后的位数 return x3; } int main() { //freopen("a.txt","r",stdin); char s[100],ss[100]; int n,i,j; while(~scanf("%s %d",s,&n)) { int l=strlen(s); int ans=0,m=0; node p1,p2; memset(ss,'\0',sizeof(ss)); j=0; for(i=0;i<l;i++) { if(s[i]!='.') ss[j++]=s[i]; //去掉小数点 else ans=l-i-1; //同时记录小数点的位置 } for(i=0;i<j;i++) { p1.num[p1.len++]=ss[j-i-1]-'0'; //数组转换为字符串 } p2=p1; //结构体复制 浅复制 for(i=1;i<n;i++) //p的n次幂 { p2=solve(p1,p2); } i=l*n; //最多有多少位 ans*=n; //小数的位数 //printf("%d %d\n",ans,i); while(!p2.num[i]&&i>=ans) i--; //确定小数点的位置 if(i==ans-1) { printf("."); for(j=0;j<i;j++) //忽略后面多余的0 if(p2.num[j]) break; for(;i>=j;i--) { printf("%d",p2.num[i]); } printf("\n"); } else { for(j=0;j<i;j++) if(p2.num[j]) break; for(;i>=j;i--) { if(i==ans-1) printf("."); printf("%d",p2.num[i]); } printf("\n"); } } return 0; }
UVA - 748 Exponentiation
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。