Sukidayo @ 2020-10-10 09:27:02
如题,比如我输入11*11,可以通过数组下标最后三位来输出121,但是放进循环来判断第一位非0,再输出就会出现奇怪的数字,代码如下,恳请大佬帮忙解答!
#include<bits/stdc++.h>
using namespace std;
void change(int *a,string x,int len1,int len2){
for(int i=0;i<len1;i++){
a[len2-1-i]=x[len1-1-i]-'0';
}
}
int* multipy(int *a,int *b,int len1,int len2){
int c[4002]={0};
for(int i=0;i<len2;i++){
for(int j=0;j<len1;j++){
if(b[len2-1-i]==0)
break;
c[4001-1-j-i]=a[len1-1-j]*b[len2-1-i]+c[4001-1-j-i];
if(c[4001-1-j-i]>9){
c[4001-2-j-i]=c[4001-2-j-i]+c[4001-1-j-i]/10;
c[4001-1-j-i]=c[4001-1-j-i]%10;
}
}
}
return c;
}
int main(){
int a[2001]={0},b[2001]={0},*c;
string x,y;
cin>>x>>y;
change(a,x,x.size(),sizeof(a)/sizeof(a[0]));
change(b,y,y.size(),sizeof(b)/sizeof(b[0]));
if(x.size()>y.size()){
c=multipy(a,b,sizeof(a)/sizeof(a[0]),sizeof(b)/sizeof(b[0]));
}
else{
c=multipy(b,a,sizeof(b)/sizeof(b[0]),sizeof(a)/sizeof(a[0]));
}
//输入11 11,这里cout<<c[3998]<<c[3999]<<c[4000];就没问题,但是下面的会出错。
for(int i=0;i<4001;i++){
if(c[i]!=0){
cout<<i<<endl;
while(i<4001){
cout<<c[i];
i++;
}
return 0;
}
}
cout<<0;
return 0;
}
by Sukidayo @ 2020-10-10 09:28:09
这是在本地跑的测试,中间有的输出是标记
by gxy001 @ 2020-10-10 10:16:15
@Sukidayo 数组在函数内定义没加 static
会在函数结束后被销毁,还有爆栈风险,所以请改成
int* multipy(int *a,int *b,int len1,int len2){
static int c[4002]={0};
...
}
static int a[2001]={0},b[2001]={0},*c;
或将变量改为全局
by Sukidayo @ 2020-10-11 10:06:40
@gxy001 非常感谢您!谢谢您的解答!