hdu 1063 Exponentiation 大数乘法
发布时间:2020-12-14 03:29:37 所属栏目:大数据 来源:网络整理
导读:题意:输入两个数R和n,R长度为6(在一行1-6列),,n为整数(在一行7-8列)。求R^n。(其中99.999R0.0,25=n0) 要求:1)输出的整数部分为0时,不输出这个0;2)不输出前导零;3)小数部分没有后缀零;4)结果为整数是没有小数点 !!!我被坑的地方是,测
题意:输入两个数R和n,R长度为6(在一行1-6列),,n为整数(在一行7-8列)。求R^n。(其中99.999>R>0.0,25>=n>0) 要求:1)输出的整数部分为0时,不输出这个0;2)不输出前导零;3)小数部分没有后缀零;4)结果为整数是没有小数点 !!!我被坑的地方是,测试代码中存在这样的R,例如:123456,不在(0.0,99.999)范围内,好坑啊 题解:比较单纯的大整数乘法。一开始先去掉小数点,剩余的就是整数m,求的m^n。然后加小数。注意的是小数点位置,如果超过了大整数m^n长,需要补零。加上小数点后就是去掉小数的后缀零,以及在结果为整数时去掉小数点。 代码: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <iostream> #include <algorithm> #include <map> #include <set> #include <queue> using namespace std; const int maxn=2e4+10; char a[10],c[1000]; int b[1000],t,k; void mul(int m)//大数乘法 { int i,j; for(i=0;i<t;i++) b[i]=b[i]*m; int temp=0,x; for(i=0;i<t;i++) { x=b[i]+temp; b[i]=x%10; temp=x/10; } while(temp) { b[t++]=temp%10; temp=temp/10; } } void pows(int m,int n)//求m^n,并输出结果 { int i,j,num=0; for(i=2;i<=n;i++) mul(m); k=k*n; //判断小数点的位置 if(k>=t) { c[num++]='.'; for(i=k-1;i>=t;i--)c[num++]='0'; for(i=t-1;i>=0;i--)c[num++]='0'+b[i]; } else { for(i=t-1;i>=0;i--) { c[num++]='0'+b[i]; if(i==k)c[num++]='.'; } } //删除小数部分后缀零和多余的小数点 while(c[num-1]=='0')num--; if(c[num-1]=='.')num--; c[num]=' '; printf("%sn",c) ;} int main() { int n; while(scanf("%s%d",a,&n)!=EOF) { //if(n==0){printf("1n");continue;} int i,m=0; for(i=0,k=0;i<6;i++) { if(a[i]=='.') { k=5-i; continue; } m=m*10+(a[i]-'0'); } t=0; i=m; //if(m==0){printf("0n");continue;} //printf("%dn",m); while(i!=0) { b[t++]=i%10; i=i/10; } pows(m,n); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |