大数乘大数
#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;
}
}
}