Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SPOJ上的快速乘法_C++_Karatsuba - Fatal编程技术网

C++ 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

我正在解决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).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
快吗?