由上方这张图我们可以知道当我有A,B两个字符数组时,答案数组C[i+j]存储a[i]*b[j]的答案值,过程中我们还要记得保存进位的保存(乘完之后不要忘记进位.如果不为0的话要保存在c[i+j+1]中)
具体细节,为了方便两个数组我们提前倒转,C数组最后记得要倒项输出
完成之后不要忘记负数的情况,加一个flag记录一下
下面代码结合了牛客网的题目:牛客网NC15765
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
int x=0,w=1;char ch=getchar();
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*w;
}
#define maxn 1000000
char a[100],b[100],aa[100],bb[100];
int c[20000];
int main() {
int T;cin>>T;
while(T--) {
//习惯性清空
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(aa,0,sizeof(aa));
memset(bb,0,sizeof(bb));
int flag1=1,flag2=1;//记录正负号
cin>>a>>b;
int lena=strlen(a),lenb=strlen(b);
if(a[0]=='-') {
flag1=-1;
for(int i=0;i<lena-1;i++) aa[i]=a[lena-i-1];
lena-=1;
}
else for(int i=0;i<lena;i++) aa[i]=a[lena-i-1];
if(b[0]=='-') {
for(int j=0;j<lenb-1;j++) bb[j]=b[lenb-j-1];
flag2=-1;
lena-=1;
}
else {
for(int i=0;i<lenb;i++) bb[i]=b[lenb-i-1];
}
//保障相乘式子上面的字符串的长度最长
if(lena<lenb) {
swap(lena,lenb);
swap(aa,bb);
}
// cout<<aa<<" "<<bb<<endl;
// cout<<a<<" "<<b<<endl;
int cj,jw;
for(int i=0;i<lenb;i++) {
for(int j=0;j<lena;j++) {
//加上进位
c[i+j]+=((aa[j]-'0')*(bb[i]-'0')+jw);
// cout<<aa[j]-'0'<<" "<<bb[i]-'0'<<" "<<c[i+j]<<endl;
jw=c[i+j]/10;
c[i+j]%=10;
//如果乘完之后还有进位,就是最高位的值
if(j==lena-1&&jw!=0) {
c[i+j+1]=jw;
jw=0;
}
}
}
//为了方便,直接先取乘积长度最长的情况,等会去除前导0即可
int lenc=lena+lenb;
if(flag1*flag2<0) cout<<"-";
int gg=0;
for(int i=lenc-1;i>=0;i--) {
if(c[i]==0&&gg==0) {
gg=1;
continue;
}
cout<<c[i];
}
cout<<endl;
}
return 0;
}
/*
1
123 26
*/