首页 > 代码库 > vj1010:高精乘+细心模拟

vj1010:高精乘+细心模拟

 

这题的话思路挺简单的,主要是打一个高精乘,然后考虑一些细节的东西

码得挺少时间的,但是调错调了很久...

讲一下思路吧:

就是读入的时候,先把小数点去掉,mark一下小数点的位置

去掉小数点之后也就进行高精乘法即可,去掉前导零

之后计算一下小数点的位置

再去掉小数点后多余的零

以及特判k=1的情况,直接输出答案

 

细节的地方主要就是在模拟上吧,

我WA了几次:

1.当小数点后面没有数字的时候,当然不需要输出小数点...这个没有考虑进去

2.没有特判k=1的情况,因为答案是放在c数组里,所以当k=1的时候,没有答案

3.数组开小了....

 

附上代码:

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;char s[201];int n,m;int l,mark;bool f;int a[100050],b[101],c[100001];void into(){	l=strlen(s);	int i=1;	f=true;	while(i<=l){		if(s[i]==‘.‘ && f){		    mark=i;			    f=false;		} 		else{			a[i]=s[l-i]-‘0‘;			i++;	    }	}	mark=l-mark;	l=i-1;	for(int j=mark;j<l;j++) a[j]=a[j+1];	for(int j=1;j<=l;j++){		b[j]=a[j];	}}int main(){	freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);	//freopen("data.txt","r",stdin);	while(cin>>s>>n){		if(n==1){			cout<<s<<"\n";			continue;		}		memset(a,0,sizeof(a));		memset(b,0,sizeof(b));		memset(c,0,sizeof(c));		mark=0;		into();		l-=1;		int bl=l;		int sum=mark-1;		for(int k=2;k<=n;k++){			memset(c,0,sizeof(c));			for(int i=1;i<=l;i++)			   for(int j=1;j<=bl;j++){			   	 c[i+j-1]+=(a[i]*b[j]);			   	 c[i+j]+=(c[i+j-1]/10);			   	 c[i+j-1]%=10;			   }			l+=bl;			l++;			mark=sum*k;			while(l>1 && !c[l] && l>mark) l--;			for(int i=1;i<=l;i++) a[i]=c[i];		}        for(int i=l;i>mark;i--){        	printf("%d",c[i]);        }        int t=1;        for(int i=1;i<=mark;i++){        	if(c[i]==0){        		t++;        	}        	else break;        }        if(t-1==mark){        	cout<<"\n";        	continue;        }        else{           cout<<".";           for(int i=mark;i>=t;i--){        	  printf("%d",c[i]);           }           cout<<"\n";		}        	}	fclose(stdin);	fclose(stdout);	return 0;}

 

vj1010:高精乘+细心模拟