高精度乘法求调
查看原帖
高精度乘法求调
304685
jiangxiaohai楼主2022/7/11 15:04
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[10001],b[10001],c[10001],answerhe[10003],answercha[10003],ji[20003];
void inint(int duru[])
{
	string ax;
	cin>>ax;
	duru[0]=ax.length();
	for(int i=1;i<=duru[0];i++)
	duru[i]=ax[duru[0]-i]-'0';
	return;
}
void print(int jieguo[])
{
	if(jieguo[0]==0)
	printf("0\n");
	else
	{
		for(int i=jieguo[0];i>=1;i--)
		printf("%d",jieguo[i]);
		printf("\n");
		return;
	}
	return ;
}
int cmp(int b1[],int b2[])					//b1>b2 return 1; 
{											//b1=b2 return 0;
	if(b1[0]>b2[0])							//b1<b2 return -1;
	return 1;
	if(b1[0]<b2[0])
	return -1;
	for(int i=b1[0];i>0;i--)					//重点,混淆了概念 
	{
		//printf("第%d次循环,b1[%d]=%d,b2[%d]=%d",i,i,b1[i],i,b2[i]);
		if(b1[i]>b2[i])
			return 1;
		else
		{
			if(b1[i]<b2[i])
			return -1;
		}
	}
	return 0;
}
void jian(int bei[],int jan[])
{
	int flag;
	flag=cmp(bei,jan);
	if(flag==0)
	{
		bei[0]=1;
		bei[1]=0;
		return;
	}
	if(flag==1)
	{
		for(int i=1;i<=bei[0];i++)
		{
			if(bei[i]<jan[i])
			{
				bei[i+1]--;
				bei[i]+=10;
			}
			bei[i]-=jan[i];
		}
		while(a[0]>1&&a[a[0]]==0)a[0]--;
		return;
	}
}
void numcpy(int p[],int q[],int det)
{
	for(int i=1;i<=p[0];i++)
	q[i+det-1]=p[i];
	q[0]=p[0]+det-1;
}
void chugao(int shang[],int chushu[],int yu[])
{
	int tmp[10003];
	yu[0]=shang[0]-chushu[0]+1;
	for(int i=c[0];i>0;i--)
	{
		memset(tmp,0,sizeof(tmp));
		numcpy(b,tmp,i);
		while(cmp(a,tmp)>=0)
		{
			c[i]++;jian(a,tmp);
		}
	}
	while(c[0]>1&&c[c[0]]==0) c[0]--;
	return ;
}
void jiafa()
{
	answerhe[0]=max(a[0],b[0]);
	for(int i=1;i<=a[0]||i<=b[0];i++)
	{
		answerhe[i]+=a[i]+b[i];
		answerhe[i+1]=answerhe[i]/10;
		answerhe[i]%=10;
	}
	if(answerhe[answerhe[0]+1]!=0)
	answerhe[0]++;
	return ;
}
void jianf(int jian[],int beijian[])
{
	answercha[0]=max(jian[0],beijian[0]);
	for(int i=1;i<=answercha[0];i++)
	{
		answercha[i]=beijian[i]-jian[i];
		if(answercha[i]<0&&beijian[i+1]>0)
		{
			answercha[i]+=10;
			beijian[i+1]--;
		}
	}
	while(answercha[0]>0&&answercha[answercha[0]]==0)
	answercha[0]--;
	return;
}
void chengf(int ch1[],int ch2[])//从这里是乘法 
{
	for(int i=1;i<=ch1[0];i++)
	{
		int x=0;
		for(int j=1;j<=ch2[0];j++)
		{
			ji[i+j-1]=ji[i+j-1]+ch1[i]*ch2[j]+x;
			x=ji[i+j-1]/10;
			ji[i+j-1]%=10;
		}
		ji[i+ch2[0]]+=x;
	}
	ji[0]=ch1[0]+ch2[0]+1;
	while(ji[0]>1&&ji[ji[0]]==0)
	ji[0]--;
	return ;
}//乘法结束 
int main()
{
	inint(a);
	inint(b);
	jiafa();
	print(answerhe);
	int flar=cmp(a,b);
	if(flar>=0)
	{
		jianf(b,a);
		print(answercha);
	}
	else
	{
		printf("-");
		jianf(a,b);
		print(answercha);
	}
	for(int i=0;i<=a[0]+b[0]+1;i++)//给积初始化 
	ji[i]=0;
	chengf(a,b);//计算乘积 
	print(ji);
	chugao(a,b,c);
	if(c[0]<=1)
	printf("%d\n",c[1]);
	else
	print(c);
	print(a);
	return 0;
}

乘法那一块算的结果有时对有时不对,不知道为什么

2022/7/11 15:04
加载中...