大数乘大数
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define range 103
void multi(char a[],char b[],char s[])
{
int i,j,k=0,alen=strlen(a),blen=strlen(b),sum=0,res[range][range]={0},flag=0;
char result[range];
for(i=0;i<alen;i++)
for(j=0;j<blen;j++)
res[i][j]=(a[i]-'0')*(b[j]-'0');
// 模拟乘法
for(i=alen-1;i>=0;i--)
{
for(j=blen-1;j>=0;j--)
sum+=res[i+blen-1-j][j];
result[k]=sum%10;
k++;
sum/=10;
}
for(i=blen-2;i>=0;i--)
{
for(j=0;j<=i;j++)
sum+=res[i-j][j];
result[k]=sum%10;
k++;
sum/=10;
}
// 处理最后的进位
if(sum)
{
result[k]=sum;
k++;
}
for(i=0;i<k;i++)
result[i]+='0';
// 字符串翻转
for(i=k-1;i>=0;i--)
s[i]=result[k-1-i];
s[k]='\0';
printf("%s\n",s);
}
int main()
{
char a[range],b[range],res[range];
cin>>a>>b;
multi(a,b,res);
return 0;
}
先用其中一个数中的每一位乘另外一个数的每一位,放到相应的位置,
举个例子:
假如:b:12345 a: 934
结果二维数组为
下面是核心代码:
for(i=alen-1;i>=0;i--)
{
for(j=blen-1;j>=0;j--)
sum+=res[i+blen-1-j][j];
result[k]=sum%10;
k++;
sum/=10;
}
for(i=blen-2;i>=0;i--)
{
for(j=0;j<=i;j++)
sum+=res[i-j][j];
result[k]=sum%10;
k++;
sum/=10;
}
第一个循环:
他第一个指的元素为res[2][4],之后访问的元素为res[3][3]、res[4][2]、res[5][1]、res[6][0](这些都为0) 结果为20,保留0,进位为2
当i==1时,访问res[1][4]、res[2][3]、res[3][2]、res[4][1]、res[5][0] 结果为31,加上刚才的2,保留3,进位3
i==0 时,类似
第二个大循环
大数乘10以内的数:
#include<iostream>
#include<string.h>
using namespace std;
#define range 200
void multi(char a[],char res[],int n)
{
int i,j,len=strlen(a),add=0,tem=0;
int temp[range];
for(i=0;i<len;i++) // 首尾逆置 ,转换为int数组
temp[len-1-i]=a[i]-'0';
for(i=0;i<len;i++) // 模拟类的题,一般都是从数的尾部开始处理的
{
temp[i]=temp[i]*n+add;
add=temp[i]/10;
temp[i]=temp[i]%10;
}
if(add) // 处理最后的进位
{
temp[len]=add;
len+=1;
}
for(i=0;i<len;i++) // 在进行一次逆置
{
res[len-1-i]=temp[i]+'0';
}
res[len]='\0';
for(i=0;i<len;i++)
printf("%c",res[i]);
}
int main()
{
char a[range],res[range];
int n;
cin>>a>>n;
multi(a,res,n);
return 0;
}