poj 1001

1664 ワード

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