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<<"
";
			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<<"
";
        	continue;
        }
        else{
           cout<<".";
           for(int i=mark;i>=t;i--){
        	  printf("%d",c[i]);
           }
           cout<<"
";
		}
        
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}
原文地址:https://www.cnblogs.com/polebug/p/4034619.html