基本思路:数组从下标为1(当然也可以为0,看个人喜好)开始倒序存储大位数,可以理解成1存放个位,2存放10位,3存放百位,以此类推。进行大数加法时,只需讲下标从1开始,俩个数组相加,满10进1即可。进行大数乘法时,循环嵌套,从第二个数组开始,第1位,到最后一位依次与第一个数组的第一位相乘,然后对第一个数组的第二位依次相乘。
为了提高运算速度,避免不必要的运算,我在函数里面加了几个参数,lena,lenb,lenc分别表示数组的有效长度(即存放了几位的数)。
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e3 + 100;
int a[maxn];
int b[maxn];
int c[maxn];
void Plus(int *a, int *c, int lena, int lenc)
{
int jw = 0;
for(int i = 1; i <= max(lena, lenc) + 10; i++){
c[i] += a[i] + jw;
jw = c[i] / 10;
c[i] %= 10;
}
}
void Mul(int *a, int b, int lena)
{
int jw = 0;
for(int i = 1; i <= lena + 10; i++){
a[i] *= b;
a[i] += jw;
jw = a[i] / 10;
a[i] %= 10;
}
}
void Mul(int *a, int *b, int *c, int lena, int lenb)
{
int jw = 0;
for(int i = 1; i <= lena + 10; i++){
jw = 0;
for(int j = 1; j <= lenb + 10; j++){
c[i + j - 1] += a[i] * b[j] + jw;
jw = c[i + j - 1] / 10;
c[i + j - 1] %= 10;
}
}
}
int main()
{
int lena, lenb;
int n;
string s, str;
cin>>s>>str;
lena = s.size();
lenb = str.size();
for(int i = 0; i < s.size(); i++){
a[i + 1] = s[s.size() - i - 1] - '0';
}
for(int j = 0; j < str.size(); j++){
b[j + 1] = str[str.size() - j - 1] - '0';
}
Plus(a,b,lena,lenb);
bool flag = true;
for(int i = 1000; i > 0; i--){
if(b[i] != 0)flag = false;
if(!flag)printf("%d", b[i]);
}
return 0;
}