80分求调,WA了第二和第五个点,代码如下
查看原帖
80分求调,WA了第二和第五个点,代码如下
1145046
chenzifan7497楼主2024/10/7 16:42
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5+7;
ll n,t;
int ar[N],br[N],cr[N];
string a;
int b;
int la,lb,lc;
void clean_it()
{
    memset(ar,0,sizeof(ar));
    memset(br,0,sizeof(br));
    memset(cr,0,sizeof(cr));
    n=t=b=la=lb=lc=0;
}
void mult(){
	fill(cr,cr+lc+3,0);
	for(int i=0;i<la;i++){
		for(int j=0;j<lb;j++){
			cr[i+j] += ar[i]*br[j];
			cr[i+j+1] += cr[i+j]/10;
			cr[i+j] %= 10;
		}
	}
	while(lc && cr[lc]==0)lc--;
}
int main(){
	while(cin>>a>>b){
		clean_it();
		la = a.size();
		ll k = 0;
		bool z=1;
		for(int i=la-1;i>=0;i--){
			if(a[i]=='0' &&z){
				la--;
				a.erase(i,1);
				continue;
			}
			z=0;
			if(a[i]=='.'){
				a.erase(i,1);
				la--;
				break;
			}
			k++;
		}
		if(k==la)k=0;
		k*=b;//计算后导零 
//		cout<<k<<endl;
		if(a[0]=='0'){
			a.erase(0,1);
			la--;
		}//去除前导零 
		for(int i=la-1;i>=0;i--){
			ar[la-i-1] = a[i]-48; 
			br[la-i-1] = ar[la-i-1];
//			cout<<ar[la-i-1];
		}lb = la;
		//倒序储存 
		b--;
		while(b--){
			lc = la*2;
			mult();
			swap(cr,ar);
			la = lc*2;
//			for(int i=la;i>=0;i--){
//				cout<<ar[i];
//			}
//			cout<<endl;
//最后时lc为长度-1 最终答案在ar中最后用的是lc 
		}
//		cout<<lc;
		lc++;
		if(k==0){
			for(int i=lc-1;i>=0;i--){
				cout<<ar[i];
			}
			continue;
		}
		if(k>=lc){//小数点起头 
			cout<<'.';
			for(int p=0;p<=(k-lc-1);p++){
				cout<<'0';
			}
			for(int i=lc-1;i>=0;i--){
				cout<<ar[i];
			}
		}
		else{
			ll l=0;
			for(int i=lc-1;i>=0;i--){
				cout<<ar[i];
				l++;
				if(l==(lc-k))cout<<'.';
			}
		}
		cout<<endl;
	}
	
	return 0;
}
2024/10/7 16:42
加载中...