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代码,仅供参考