hdu-1063(大数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1063
思路:1、大数乘法模板
2、考虑小数点的位置
3、乘法前后判断前后道0
参考文章:https://blog.csdn.net/z8110/article/details/50167049
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[707],b[707],c[707]; char s[10]; void f(int a[]) { int i,j,k; memset(c,0,sizeof(c)); for(i=0;i<10;i++) { for(j=0;j<200;j++) c[i+j]+=a[i]*b[j]; } for(i=0;i<200;i++) { if(c[i]>=10) c[i+1]+=c[i]/10; c[i]%=10; } for(i=0;i<300;i++) { b[i]=c[i]; } } int main(void) { int i,j,cnt,p1,p2,n; while(~scanf("%s%d",s,&n)) { //初始化 int l=strlen(s); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); cnt=0; for(i=l-1;i>=0;i--) if(s[i]=='.') cnt=l-1-i; // 判断小数点位置 //判断是否是小数 p1=0; for(i=l-1;i>=0;i--) //判断后导零 if(s[i]!='0') break; if(s[i]=='.') p1=1; for(i=l-1;i>=0;i--) { if(s[i]=='.') break; } if(i==-1) p1=1; //乘法计算 b[0]=1; for(j=0,i=l-1;i>=0;i--) if(s[i]>='0'&&s[i]<='9') a[j++]=s[i]-'0'; for(i=0;i<n;i++) f(a); //输出 for(i=200;i>=cnt*n;i--) if(b[i]) break; for(;i>=cnt*n;i--) printf("%d",b[i]); if(p1==0) printf("."); //输出小数点 for(;i>=0;i--) //判断,保证不输出前导零 { p2=0; for(j=i;j>=0;j--) { if(b[j]) { p2=1; break; } } if(p2) printf("%d",b[i]); } printf("\n"); } return 0; }