通过函数返回数组指针无法得到正确结果

P1303 A*B Problem

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 非常感谢您!谢谢您的解答!


|