简单模拟题,用数组存放 浮点数,要判断是否有小数点,然后模拟乘法运算,做的有点那啥了。。
#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;
}