大数乘法模板

大数乘大数

#include <bits/stdc++.h>
using namespace std;
char a[1000],b[1000],c[2000];
void multiplication(char s[]){
	int aa[1000],bb[1000];
	int cc[2000]; 
	memset(cc,0,sizeof(cc));
	memset(bb,0,sizeof(bb));
	memset(aa,0,sizeof(aa));
	int len1=strlen(a)-1;
	int len2=strlen(b)-1;
	int d=0;
	while(len1>=0){//使得低位到高位 
		aa[d]=a[len1]-'0';
		d++;
		len1--;
	}
	d=0;
	while(len2>=0){//使得低位到高位 
		bb[d]=b[len2]-'0';
		d++;
		len2--;
	}
	len1=strlen(a)-1;
	len2=strlen(b);
	for(int i=0;i<=len1;i++){
		int w=0;//进位所用
		for(int j=0;j<=len2;j++){//十分巧妙,防止w最后还大于0 
			int ans=aa[i]*bb[j]+w;//因为i+j是递增的所以直接加上上一次进位的w
			w=ans/10;//进位改变为向下以为的进位(是这次相乘的进位,待会还行改变,因为相加时也可能照成进位) 
			cc[i+j]+=ans%10;//直接加上赋值
			ans=cc[i+j];//保存以待进位  
			cc[i+j]=cc[i+j]%10;//只取余数
			w+=ans/10;//加上相加后的进位数 
		} 
	}
	int len3=len1+len2+2;
	while(cc[len3]==0 && len3>=0)
		len3--;
	if(len3<0){
		c[0]='0';
		c[1]='\0';
		return ;
	}
	d=0;
	c[len3+1]='\0';
	while(len3>=0){
		s[d++]=cc[len3--]+'0';
	}
}
int main(){
	while(scanf("%s %s",a,b)!=EOF){
		multiplication(c);
		cout<<c<<endl;
	}
}
或
#include <bits/stdc++.h>
using namespace std;
void chen(char a[],char b[],char c[])
{
    int i,j,len1,len2,*s;
    len1=strlen(a);
    len2=strlen(b);
    s=(int*)malloc(sizeof(int)*(len1+len2));
    for(i=0;i<len1+len2;i++)
        s[i]=0;
    for (i=0;i<len1;i++)
        for (j=0;j<len2;j++)
            s[i+j+1]+=(a[i]-'0')*(b[j]-'0');
    for (i=len1+len2-1;i>=0;i--)
        if (s[i]>=10){
            s[i-1]+=s[i]/10;
            s[i]%=10;
        }
    i=0;
    while(s[i]==0)
        i++;
    for (j=0;i<len1+len2;i++,j++)
        c[j]=s[i]+'0';
    c[j]='\0';
    free(s);
}

大数乘小数

void mult(int A,int B[],int C[]){
	int len1=1999;
	while(b[len1]==0) len1--;//找到最高位的位置 
	int c=0;
	int i;
	for(i=0;i<=len1;i++){
		C[i]=B[i]*A+c;
		c=C[i]/10;
		C[i]=C[i]%10;
	}
	if(c){//防止漏了最高位的判断 
		while(c){
			C[i++]=c%10;
			c/=10;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/doublekillyeye/article/details/81101022
今日推荐