有谁能帮我纠正一下快速高精乘的代码?
  • 板块学术版
  • 楼主caojiaming
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/25 16:37
  • 上次更新2023/10/23 20:32:50
查看原帖
有谁能帮我纠正一下快速高精乘的代码?
775551
caojiaming楼主2023/3/25 16:37

虽然输入小数据没问题,但输入数据过大就运行时错误

#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算法
}

2023/3/25 16:37
加载中...