虽然输入小数据没问题,但输入数据过大就运行时错误
#include <bits/stdc++.h>
using namespace std;
const int MAXN=3000010;
int a[MAXN]={},b[MAXN]={},c[MAXN]={};
string add(string s1,string s2)
{
int l1=s1.size(),l2=s2.size();
int L=max(l1,l2),anslen=L+1;
string ans="";
for(int i=1;i<=L;i++)
{
a[i]=b[i]=c[i]=0;
}
for(int i=0;i<l1;i++)
{
a[i+1]=s1[l1-i-1]-'0';
}
for(int i=0;i<l2;i++)
{
b[i+1]=s2[l2-i-1]-'0';
}
for(int i=1;i<=L;i++)
{
c[i]+=a[i]+b[i];
if(c[i]>=10)
{
c[i+1]++;
c[i]-=10;
}
}
while(c[anslen]==0)
{
anslen--;
}
for(int i=anslen;i>=1;i--)
{
ans=ans+(char)(c[i]+'0');
}
return ans;
}
string mis(string s1,string s2)
{
int l1=s1.size(),l2=s2.size();
int L=max(l1,l2),anslen=L+1;
string ans="";
for(int i=1;i<=L;i++)
{
a[i]=b[i]=c[i]=0;
}
for(int i=0;i<l1;i++)
{
a[i+1]=s1[l1-i-1]-'0';
}
for(int i=0;i<l2;i++)
{
b[i+1]=s2[l2-i-1]-'0';
}
for(int i=1;i<=L;i++)
{
c[i]+=a[i]-b[i];
if(c[i]<0)
{
c[i+1]--;
c[i]+=10;
}
}
while(c[anslen]==0)
{
anslen--;
}
for(int i=anslen;i>=1;i--)
{
ans=ans+(char)(c[i]+'0');
}
return ans;
}
string lowmul(string s1,string s2)
{
int Ans=(s1[0]-'0')*(s2[0]-'0');
return to_string(Ans);
}
string s3="",s4="",s5="",s6="",s7="",s8="";
string str1="",str2="",str3="",str4="";
void stringset()
{
s3="",s4="",s5="",s6="",s7="",s8="";
str1="",str2="",str3="",str4="";
}
string func(string s1,string s2)
{
if(s1.length()==1)
{
return lowmul(s1,s2);
}
stringset();
int l=s1.length();
int l1=l/2;
for(int i=0;i<l1;i++)
{
str1+=s1[i];
str3+=s2[i];
}
for(int i=l1;i<l;i++)
{
str2+=s1[i];
str4+=s2[i];
}
s3=func(str1,str3);
s4=func(str2,str4);
s5=add(str1,str2);
s6=add(str4,str3);
s7=func(s5,s6);
s8=mis(s7,add(s3,s4));
//s3,s8,s4
string ping="";
for(int i=1;i<=l1;i++)
{
ping+="0";
}
return add(add(s3+ping+ping,s8+ping),s4);
}
string fft(string s1,string s2)
{
while(s1.length()<s2.length())
{
s1="0"+s1;
}
while(s2.length()<s1.length())
{
s2="0"+s2;
}
return func(s1,s2);
}
int main()
{
string S1,S2;
cin>>S1>>S2;
cout<<fft(S1,S2);
return 0;//模拟Karatsuba算法
}