现在的位置: 首页 > 综合 > 正文

poj 1001

2014年03月13日 ⁄ 综合 ⁄ 共 1165字 ⁄ 字号 评论关闭

简单模拟题,用数组存放 浮点数,要判断是否有小数点,然后模拟乘法运算,做的有点那啥了。。

#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;
}

抱歉!评论已关闭.