求大佬帮助,结果一直是一位数,感觉思路没问题,新手

P1303 A*B Problem

cccckick @ 2024-11-01 00:37:49


#include <bits/stdc++.h>
using namespace std;
#define int long long

string aa(string a, string b) {
    if (a == "0" || b == "0") return "0";  // 特殊情况
    string c;
    int A = a.size()-1;
    int B = b.size()-1;
    int flag=0;//进位符号 
    for(int i=min(A,B);i>=0;--i)//思路是用位数少的乘以位数多的,位数少的从最低位开始遍历乘以位数大的那个数 
    {

     for(int j=max(A,B);j>=0;--j)
     {
        int sum=flag;
        if(a.size()<b.size())//如果字符串a的大小小于b的,把i给a 
        {
        int cheng=(a[i]-'0')*(b[j]-'0');
        sum+=cheng;
        c.push_back(sum%10+'0');
        flag=sum/10;
     }
        else
        {       
        int cheng=(b[i]-'0')*(a[j]-'0');//把i给b 
        sum+=cheng;
        c.push_back(sum%10+'0');
        flag=sum/10;
    }
       }
}
       reverse(c.begin(),c.end());
       return c;
}
signed main() {
    string a, b;
    cin >> a >> b;
    cout << aa(a,b);
}

by 南苑 @ 2024-11-01 06:34:22

@cccckick 你的两层循环会导致多余的进位,有一种比较好地思路是你先把字符串转变为int数组,然后在模拟。当然,按你的思路来,除了第一次循环时push_back比较多之外,剩下都在原来的基础上进行,有进位需求了再进行进位操作(明显发现你对c的修改仅限于向后增添而对于原先存在的并没有修改)


by Ewigesherz @ 2024-11-01 20:21:35

#include<bits/stdc++.h>
using namespace std;
string a, b;
int v[4][10010];
void q(int x, int y) {
    for (int i = 0; i < x; i++) {
        for (int j = 0; j < y; j++) {
            v[3][i + j] += v[1][i] * v[2][j];
        }
    }
    for (int i = 0; i <= x + y; i++) {
        if (v[3][i] > 9) {
            v[3][i + 1] += (v[3][i] / 10);
            v[3][i] %= 10;
        }
    }
    x = 5000;
    while (v[3][x] == 0) {
        x--;
    }
    for (int i = x; i >= 0; i--) {
        cout << v[3][i];
    }
}
int main() {
    cin >> a >> b;
    if (a[0] - '0' == 0 or b[0] - '0' == 0) {
        cout << 0;
        return 0;
    }
    int l1 = a.size();
    for (int i = 0; i < l1; i++) {
        v[1][i] = a[l1 - i - 1] - '0';
    }
    int l2 = b.size();
    for (int i = 0; i < l2; i++) {
        v[2][i] = b[l2 - i - 1] - '0';
    }
    q(l1, l2);
}

这是我的AC代码,仅供参考


|