今天写题目发现大数模拟有点忘了,复习一下。
其实就是对人工运算的一个模拟,没有涉及到傅立叶变换这些高端算法。
算法的内核有个博主写的很明白了:大数模拟
这里贴一下自己的手操模拟,记录一下。
(加上了判断正负的模块)
代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pre(i,a,b) for(int i=a;i>=b;--i)
#define m(x) memset(x,0,sizeof x)
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define PI acos(-1)
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
const int maxn = 1e5+10;
string a,b;
//c的下标代表有几个0
int c[maxn];
int main()
{
while(cin>>a>>b)
{
int flag = 0;
if((a[0]=='-'&&b[0]!='0')||(b[0]=='-'&&a[0]!='0'))flag = 1;
if(a[0]=='-')a.erase(0,1);
if(b[0]=='-')b.erase(0,1);
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
//cout << a << " " << b << endl;
m(c);
int lena = (int)a.size();
int lenb = (int)b.size();
//定住a数据,让b数据从权值小的顺序到大的方向于a每一位相乘,得到的数据根据0的个数存进c
for(int i=0;i<lenb;i++)
{
for(int j=0;j<lena;++j)
{
int ta = a[j] - '0';
int tb = b[i] - '0';
//printf("%d %d\n",ta,tb);
c[i+j] += ta*tb;
}
}
int t = 0,x;
for(int i=0;i<=lena+lenb-2;i++){
if(i!=0)c[i] += t;
if(c[i]/10>=0){
x = c[i] % 10;
t = c[i] / 10;
c[i] = x;
}
}
int l = lena+lenb;
while(c[l]==0)l--;
//printf("%d\n",l);
if(flag)printf("-");
for(int i=l;i>=0;i--)printf("%d",c[i]);
printf("\n");
}
return 0;
}