求调高精度四则运算,已经快不行了,悬赏一关注
  • 板块学术版
  • 楼主Rain_chr
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/2/20 16:34
  • 上次更新2023/10/24 00:15:38
查看原帖
求调高精度四则运算,已经快不行了,悬赏一关注
684254
Rain_chr楼主2023/2/20 16:34
struct number
{
	int a[N+10],cnt;
	void read()
	{
		int ans=0;
		char x=getchar();
		while(x>'9'||x<'0')
			x=getchar();
		while(x>='0'&&x<='9')
		{
			a[++cnt]=x-'0';
			x=getchar();
		}
		for(int i=1;i<=cnt/2;i++)
			swap(a[i],a[cnt-i+1]);
	}
	void init(int x)
	{
		memset(a,0,sizeof(a)); 
		cnt=0;
		while(x)
		{
			a[++cnt]=x%10;
			x/=10;
		}
	}
	void pro (number x)
	{
		number c;
		c.init(0);
		for(int i=1;i<=x.cnt;i++)
			for(int j=1;j<=cnt;j++)
				c.a[i+j-1]+=a[j]*x.a[i];
		for(int i=1;i<=N;i++)
			c.a[i+1]+=c.a[i]/10,c.a[i]%=10;
		c.cnt=N;
		while(!c.a[c.cnt]&&c.cnt)
			c.cnt--;
		for(int i=1;i<=c.cnt;i++)
			a[i]=c.a[i];
		cnt=c.cnt;
	} 
	void add(number x)
	{
		number c;
		c.init(0);
		for(int i=1;i<=N;i++)
			c.a[i]=a[i]+x.a[i];
		for(int i=1;i<=N;i++)
			c.a[i+1]+=c.a[i]/10,c.a[i]%=10;
		c.cnt=N;
		while(!c.a[c.cnt]&&c.cnt)
			c.cnt--;
		for(int i=1;i<=c.cnt;i++)
			a[i]=c.a[i];
		cnt=c.cnt;
	}
	void sub(number x)
	{
		for(int i=1;i<=N;i++)
			a[i]-=x.a[i];
		for(int i=1;i<=N;i++)
			if(a[i]<0)
			{
				a[i+1]+=abs(a[i])/10-1;
				a[i]=a[i]%10+10;
			}
		cnt=N;
		while(!a[cnt]&&cnt)
			cnt--;
	}
	bool cmp(number x)
	{
		if(x.cnt>cnt)
			return 0;
		if(x.cnt<cnt)
			return 1;
		for(int i=cnt;i;i--)
		{
			if(a[i]>x.a[i])
				return 1;
			if(a[i]<x.a[i])
				return 0;
		}
		return 1;
	}
	void div(number x)
	{
		number tmp,ans;
		tmp.init(0);
		ans.init(0);
		int p=cnt,res=0;
		while(p)
		{
			while(!tmp.cmp(x)&&p)
			{
				tmp.pro((number){{0,0,1},2});
				tmp.add((number){{0,a[p]},1});
				if(!a[p])
					res++;
				else
					res=0;
				p--;
			}
			ans.pro((number){{0,0,1},2});
			while(tmp.cmp(x))
			{
				ans.add((number){{0,1},1});
				tmp.sub(x);
			}
		}
		while(res>1)
		{
			res--;
			ans.pro((number){{0,0,1},2}); 
		}
		cnt=N;
		while(!ans.a[cnt]&&cnt)
			cnt--;
		for(int i=1;i<=cnt;i++)
			a[i]=ans.a[i];
	}
	void print()
	{
		if(!cnt)
			putchar('0');
		for(int i=cnt;i;i--)
			putchar(a[i]+'0');
		putchar('\n');
	}
}sum,num;
2023/2/20 16:34
加载中...