第一个点 输入是10和0,输出是0,为啥不给过。。

P1303 A*B Problem

czm2526366 @ 2022-02-26 23:35:03

using namespace std;
#include<iostream>
#include<algorithm>
#include<math.h>
#include<iomanip>
#include<string>

int* stoa(string a) 
{
    int* A = new int[a.size()];
    for (int i = 0; i < a.size(); i++) {
        A[i] = a[a.size() - 1 - i] - '0';
    }
    return A;
}

int main()
{
    string a1, b1;
    cin >> a1>> b1;
    int* a = stoa(a1);
    int* b = stoa(b1);
    int* ans = new int[a1.size() + b1.size()]{ 0 };
    for (int i = 0; i < b1.size(); i++) {
        for (int j = 0; j < a1.size(); j++) {
            ans[i + j] += (b[i] * a[j]);
        }
        for (int i = 0; i < a1.size() + b1.size(); i++) {
            if (ans[i] >= 10) {
                ans[i + 1] += ans[i] / 10;
                ans[i] %= 10;
            }
        }
    }

    int i = a1.size() + b1.size() - 1;
    while (ans[i] == 0)
        i--;
    if (i == -1) {
        cout << 0;
        return 0;
    }
    for (; i >= 0; i--) {
        cout << ans[i];
    }

}

by Arefa @ 2022-02-26 23:48:24

洛谷IDE结果:空

while (ans[i] == 0)

i--;

这段本身就有问题,当ans全是空时,ans[-1]是什么?下表越界?

而IDE上输出可发现i最小还到了-2才停止......

这说明你访问了一些不知道属于谁的内存空间......

i到了-2,自然不会 ==-1 也就不会输出0了。 如果在自己的编辑环境输出了0,那是运气好......

这段可以改为:

while(i>0 && ans[i]==0)
    i--;

至于是否还有其他问题,未进行深究。


|