C++ SPOJ上的快速乘法
我正在解决SPOJ问题。 我的解决方案如下所示:C++ SPOJ上的快速乘法,c++,karatsuba,C++,Karatsuba,我正在解决SPOJ问题。 我的解决方案如下所示: #include<bits/stdc++.h> using namespace std; int max(int a,int b) { if(a>b) return a; return b; } long karatsuba_multiply(int x,int y) { if(x<10 or y<10) return x*y; int n=max(to_string(x).lengt
#include<bits/stdc++.h>
using namespace std;
int max(int a,int b)
{
if(a>b) return a;
return b;
}
long karatsuba_multiply(int x,int y)
{
if(x<10 or y<10) return x*y;
int n=max(to_string(x).length(),to_string(y).length());
int m=(int)ceil(n/2.0);
long p=(long)pow(10,m);
long a=(long)(floor(x/p));
long b=x%p;
long c=(long)(y/p);
long d=y%p;
long ac=karatsuba_multiply(a,c);
long bd=karatsuba_multiply(b,d);
long adbc=karatsuba_multiply(a+b,c+d)-ac-bd;
return (long)(pow(10*1,2*m)*ac+pow(10*1,m)*adbc+bd);
}
int main()
{
int a,b,t;
cin>>t;
while(t--)
{
cin>>a>>b;
cout<<karatsuba_multiply(a,b)<<endl;
}
return 0;
}
#包括
使用名称空间std;
最大整数(整数a,整数b)
{
如果(a>b)返回a;
返回b;
}
长形卡氏乘法(整数x,整数y)
{
if(xt;
而(t--)
{
cin>>a>>b;
从问题描述中可以看出:
Input
n [the number of multiplications <= 1000]
l1 l2 [numbers to multiply (at most 10000 decimal digits each)]
Text grouped in [ ] does not appear in the input file.
输入
n[乘法数C++最初只支持无符号长整数的最大长度,大约为1.8e19
根据这个问题,答案可能高达1亿1千万,这要大得多
解决这个问题的方法是:
- 使用字符串存储整数,并使用字符串上的运算进行乘法。您可以检查
- 使用。此库支持超出1e19限制的整数操作
另一种方法是使用其他支持大于64位整数的语言(如Python)或在Java中使用BigInteger类您没有测试代码是否有足够的输入。如果您这样做,您将看到您使用的输入类型错误。int
不能保持“l1 l2[数字相乘(每个十进制数字最多10000位)]”。请阅读并尝试输入500位数字。例如,您在错误的一端进行优化。诀窍是处理大量数字,而不是击败内置的*
整数。您真的希望karatsuba_乘法(x,y)
对于int
s要比x*y
快吗?