poj 1001
簡単なシミュレーション問題では、浮動小数点数を配列で格納し、小数点があるかどうかを判断し、乗算をシミュレートして、何かをします.
#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("
");
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
",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("
");
}
return 0;
}