10106 - Product()

简单大整数相乘的问题

需要注意事项:

①对字符串处理要用memset(a,'0',sizeof(a));不可将'0'误写成0,memset可对字符数组进行任意赋值,处理长度为一个字节

②前置零处理

③单个零的特殊处理


//通过
#include <stdio.h>
#include <string.h>
int main()
{
	char x[260],y[260],mul[520];
	while(scanf("%s%s",x,y)==2)
	{
		int u;
		memset(mul,0,sizeof(mul));
		int ylen=strlen(y);
		int xlen=strlen(x);
		for(int i=0;i<xlen;i++)
			x[i]-='0';
		for(int i=0;i<ylen;i++)
			y[i]-='0';
		for(int k=ylen-1;k>=0;k--)
		{
			int p,q;
			q=0;
			u=ylen-1-k;
			for(int j=xlen-1;j>=0;j--)
			{
				p=x[j]*y[k]+q+mul[u];
				mul[u++]=p%10;
				q=p/10;
			}
			if(q)
				mul[u++]=q;
		}
		int i;
		for(i=u-1;i>0;i--)//###,出错原因--前置零的处理
			if(mul[i])
				break;
		for(;i>=0;i--)
			printf("%d",mul[i]);
		printf("\n");
	}
	return 0;
}
//通过
#include <stdio.h>
#include <string.h>
#define M 260

void reverse(char a[])
{
	int len=strlen(a);
	for(int i=0;i<len/2;i++)
	{
		char temp=a[len-1-i];
		a[len-1-i]=a[i];
		a[i]=temp;
	}
}

void mutiply(char a[],char b[],char c[])
{
	if (strcmp(a, "0") == 0 || strcmp(b, "0") == 0)//###,必须要做考虑,否则要加对前置零的处理。
	{
		strcpy(c,"0");
		return;
	}
	int alen,blen,q;
	alen=strlen(a);
	blen=strlen(b);
	
	for(int i=0;i<alen;i++)
	{
		q=0;
		for(int j=0;j<blen;j++)
		{
			int p=(a[i]-'0')*(b[j]-'0')+c[i+j]-'0'+q;
			q=p/10;
			c[i+j]=p%10+'0';
		}
		if(q!=0)
			c[i+blen]=q+'0';
	}
	if(q!=0)
		c[alen+blen]='\0';
	else
		c[alen+blen-1]='\0';
	
}

int main()
{
	char x[M],y[M],result[2*M];
	while(scanf("%s%s",x,y)==2)
	{
		reverse(x);
		reverse(y);
		memset(result,'0',sizeof(result));//这里的处理必须为'0',而不是0
		mutiply(x,y,result);
		reverse(result);
		printf("%s\n",result);
	}
	return 0;
}

第二次做:

#include <cstdio>
#include <cstring>
const int nMax=260;
int f1[nMax],f2[nMax];
int f3[2*nMax];
char line[nMax];
void clear_front_zero(int *f)
{
	int n=f[0];
	while(!f[n]) n--;
	f[0]=n;
	if(n<1)//①出错原因,单个零处理
		f[0]=1,f[1]=0;
}
void traverse(int *f,char *l)
{
	//int a=sizeof(f);
	//对待形参的数组,不能使用sizeof,否则,计算的字节长只为一个指针类型的长度4
	int len=strlen(l);
	for(int i=0;i<len;i++)
		f[len-i]=l[i]-'0';
	f[0]=len;
	clear_front_zero(f);
}
void multiply(int *f3,int *f1,int *f2)
{
	//memset(f3,0,sizeof(f3));
	int i,j;
	for(i=1;i<=f1[0];i++)
	{
		int q=0;
		for(j=1;j<=f2[0] || q;j++)
		{
			int p=f3[i+j-1]+f2[j]*f1[i]+q;
			f3[i+j-1]=p%10;
			q=p/10;
		}
	}
	f3[0]=i+j-2;
	clear_front_zero(f3);
}
void print(int *f3)
{
	for(int i=f3[0];i>0;i--)
		printf("%d",f3[i]);
}
int main()
{
	//freopen("f:/data.in","r",stdin);
	while(gets(line))
	{
		memset(f1,0,sizeof(f1));
		traverse(f1,line);
		gets(line);
		memset(f2,0,sizeof(f2));
		traverse(f2,line);
		memset(f3,0,sizeof(f3));
		multiply(f3,f1,f2);
		print(f3);
		printf("\n");
	}
	return 0;
}


你可能感兴趣的:(10106 - Product())