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;

}

 

你可能感兴趣的:(模拟)