简单模拟题,用数组存放 浮点数,要判断是否有小数点,然后模拟乘法运算,做的有点那啥了。。
#include<cstdio> #include<cstring> #define for if(0);else for const int mod=10; const int maxn=10000; char s[maxn]; int num[maxn],num2[maxn],tmp[maxn];//num记录最后结果,num2作乘数,tmp作中间存储 int main(){ int n; while(scanf("%s%d",s,&n)==2){ int d=-1;//记录小数点后有几位数 int len=strlen(s); int i=0,j,k; while(s[i]=='0')i++;//除去前导0 for(j=0;i<len;i++){ if(s[i]!='.'){ num2[j++]=s[i]-'0'; } else { while(s[len-1]=='0')len--;//除去无用0 d=len-1-i;//找到小数点,记录位数 } } if(n==1){//一次直接输出 for(i=0;i<j;i++){ if(j-i==d)putchar('.'); printf("%d",num2[i]); } printf("\n"); continue; } for(i=j-1,k=0;i>=0;i--,k++)tmp[k]=num2[i];//倒叙存储,方便计算 for(i=0;i<k;i++)num2[i]=tmp[i]; int dlen=j,nlen=0,nlen2=j;//dlen为乘数长度,nlen为num长度。。 for(i=1;i<n;i++){ memset(num,0,sizeof(num)); for(j=0;j<dlen;j++){ if(num2[j]==0)continue; int c=0; nlen=j; for(k=0;k<nlen2;k++){ num[nlen]+=tmp[k]*num2[j]; num[nlen]+=c; c=num[nlen]/mod; num[nlen]%=mod; //printf("num %d\n",num[nlen]); nlen++; } if(c){num[nlen++]=c;}//一轮完有进位 } if(i<n-1){ for(int k=0;k<nlen;k++){tmp[k]=num[k];} nlen2=nlen; } } d*=n; int flag=0; if(nlen<d)putchar('.'),flag=1; while(nlen<d)num[nlen++]=0; for(i=nlen-1;i>=0;i--){ if(!flag&&i+1==d)putchar('.'); printf("%d",num[i]); } printf("\n"); } return 0; }