问题代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 55;
typedef vector<int> BI;
typedef unsigned long long ULL;
/*
num 1 0 0 0 0 0
v_i 6 5 4 3 2 1
*/
void print(BI x)
{
int lx = x.size();
for (int i = lx ; i >= 1; i -- )
{
printf("%d ",x[i]);
}
}
BI in(ULL x)
{
BI c(64);
for(int i = 1;x != 0;i++)
{
printf("%d %d\n",x,x%10);
c[i] = (x%10);
x /= 10;
}
print(c);
printf("\n");
while(c.size() != 0 and c.back() == 0)c.pop_back();
print(c);
printf("\n");
return c;
}
BI operator + (const BI a,const BI b)
{
int la = a.size();
int lb = b.size();
BI c(max(la,lb) + 5);
for (int i = 1; i <= la; i ++ )
{
c[i] += a[i];
}
for (int i = 1; i <= lb; i ++)
{
c[i] += b[i];
}
for (int i = 1; i <= max(la,lb); i ++ )
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
while(c.size() != 0 and c.back() == 0)c.pop_back();
return c;
}
BI operator * (const BI a, const BI b)
{
int la = a.size();
int lb = b.size();
BI c(la + lb + 2);
//print(c);
for(int i = 1; i <= la;i++)
{
for(int j = 1;j <= lb;j++)
{
c[i+j-1] += a[i] * b[j];
printf("i : %d j:%d c : %d\n",i,j,c[i+j-1]);
}
}
print(c);
while(c.size() != 0 and c.back() == 0)c.pop_back();
return c;
}
int main()
{
BI a,b;
a = in(ULL(100000000));
b = in(ULL(222222222));
BI c = a*b;
//print(c);
}
输出如下:(去除了一些不必要的避免过长)
100000000 0
10000000 0
1000000 0
100000 0
10000 0
1000 0
100 0
10 0
1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
131761 1 0 0 0 0 0 0 0 0
222222222 2
22222222 2
2222222 2
222222 2
22222 2
2222 2
222 2
22 2
2 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2
273 2 2 2 2 2 2 2 2 2
i : 9 j:1 c : 2
i : 9 j:2 c : 2
i : 9 j:3 c : 2
i : 9 j:4 c : 2
i : 9 j:5 c : 2
i : 9 j:6 c : 2
i : 9 j:7 c : 2
i : 9 j:8 c : 2
i : 9 j:9 c : 2
i : 9 j:10 c : 273
i : 10 j:1 c : 196
i : 10 j:2 c : 196
i : 10 j:3 c : 196
i : 10 j:4 c : 196
i : 10 j:5 c : 196
...
求助去前导零前一切正常,去完在最末尾出现一个奇怪的数