我的第五个点总是错误,请求大神帮忙看看代码啊
查看原帖
我的第五个点总是错误,请求大神帮忙看看代码啊
350663
xinghe楼主2022/2/23 10:42
#include<iostream>
#include<cstring>
using namespace std;
string R;//输入的小数R
int len,x,xsw,a[1001000],n;//len:R的总位数,x:R转成整数后的数字,xsw:小数位有几位,a数组:存放高精度乘法后的结果,n:n次方。
void gmul() {
	for(int i=1; i<=a[0]; i++) a[i]*=x;
	for(int i=1; i<=a[0]; i++) {
		a[i+1]+=a[i]/10;
		a[i]%=10;
	}
	while(a[a[0]+1]) {
		a[0]++;
		a[a[0]+1]+=a[a[0]]/10;
		a[a[0]]%=10;
	}
}
int main() {
//	freopen("ddd.in","r",stdin);
//	freopen("ddd.out","w",stdout);
	while(cin>>R>>n) {
		xsw=0;//xsw小数位数初始化。
		x=0;//x小数变整数的初始化。
		memset(a,0,sizeof(a));
		a[0]=1;
		a[1]=1;
		len=R.length();//R的总长度
		for(int i=0; i<len; i++) {//转存成整数
			if(R[i]=='.') {
				xsw=len-i-1;
				continue;
			}
			x=x*10+R[i]-'0';
		}
		//上面完成了R转成整数x的操作,同时记录下了小数的位数xsw。
		//cout<<x<<" "<<xsw<<endl;
		while(x%10==0&&xsw>0) {
			x/=10;
			xsw--;
		}//处理一下xsw,杜绝小数末尾零。
		if(x==0) {
			cout<<0<<endl;
			continue;
		}//对底数为0的进行特判,为什么,因为a数组的初始值设置为了1,如果不做特判,后面也是要特殊处理一下的。
		for(int i=1; i<=n; i++) gmul();
		xsw*=n;
		//此时a数组里面存放了x的n次方结果。xsw记录了a数组应有的小数位数。
		//后面开始准备输出。
		if(a[0]==1&&a[1]==0) {
			cout<<0<<endl;
			continue;
		}
		int begin=max(a[0],xsw);
		int end;
		for(int i=1; i<=xsw; i++)
			if(a[i]) {
				end=i;
				break;
			}//上面找到开始输出的位置和结束输出的位置。
		for(int i=begin; i>xsw; i--) cout<<a[i];//输出小数点前面的数字。
		if(xsw>=end) cout<<'.';
		for(int i=xsw; i>=end; i--) cout<<a[i];//输出小数点后面的数字。
		cout<<endl;
	}
	return 0;
}
2022/2/23 10:42
加载中...