#include <bits/stdc++.h>
using namespace std;
int x[2001], y[2001], ans[2001];//定义存数数组
int main()
{
string a, b; cin >> a >> b;
int la = a.size(); int lb = b.size();
int ll = max(la, lb);//记录数的长度,和较长
for (int i = 0; i < la; i++)
{
x[i] = a[i]-'0';//字符串转数组
}
for (int i = 0; i < lb; i++)
{
y[i] = b[i] - '0';
}
la -= 1; lb -= 1;//长度减一才是个位
for (int i = ll-1; i >=0; i--)
{
ans[i] = x[la--] + y[lb--]+ans[i];//从个位加到最高位
if (ans[i] > 9)//模拟加法
{
ans[i - 1]++;
ans[i] -= 10;
}
}
if (x[0] + y[0] > 9)cout << 1;//如果最高位相加大于9,先进一位
for (int i = 0; i < ll; i++)
{
cout << ans[i];
}
}
应该没啥问题,洛谷能过
改进了一下,增加了计算位数再输出
#include <bits/stdc++.h>
using namespace std;
int x[2001], y[2001], ans[2001];//定义存数数组
int main()
{
string a, b; cin >> a >> b;
int la = a.size(); int lb = b.size();
int ll = max(la, lb);//记录数的长度,和较长
for (int i = la-1; i>=0; i--)
{
x[la-1-i] = a[i] - '0';//字符串转数组
}
for (int i = lb - 1; i >= 0; i--)
{
y[lb-1-i] = b[i] - '0';
}
for (int i = 0; i <= ll ; i++)
{
ans[i] = x[i] + y[i]+ans[i];//从个位加到最高位
if (ans[i] > 9)//模拟加法
{
ans[i + 1]++;
ans[i] -= 10;
}
}
int ws=0;
for (int i = 0; i <=2000; i++)
{
if (ans[i] != 0)ws = i;//找答案位数
}
for (int i = ws; i >= 0; i--)
cout << ans[i];
}
改进之后可以改成高精度乘法,同时增加了数组位数到4000
#include <bits/stdc++.h>
using namespace std;
int x[2001], y[2001], ans[4001];//定义存数数组
int main()
{
string a, b; cin >> a >> b;
int la = a.size(); int lb = b.size();
int ll = max(la, lb);//记录数的长度,和较长
for (int i = la-1; i>=0; i--)
{
x[la-1-i] = a[i] - '0';//字符串转数组
}
for (int i = lb - 1; i >= 0; i--)
{
y[lb-1-i] = b[i] - '0';
}
for (int i = 0; i <= ll-1; i++)
{
for (int j = 0; j <= ll-1; j++)
{
ans[i + j] += x[i] * y[j];//从个位开始模拟乘法
while (ans[i + j] > 9)
{
ans[i + j + 1]++;
ans[i + j] -= 10;
}
}
}
int ws=0;
for (int i = 0; i <=4000; i++)
{
if (ans[i] != 0)ws = i;//找答案位数
}
for (int i = ws; i >= 0; i--)
cout << ans[i];
}