Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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+的新手+;我想知道如何进一步优化这段代码 我是C++的新手,我必须优化这个代码,使它在1.5秒内执行,输入值高达10 ^ 6。 但执行输入10^6需要3.52秒_C++_Optimization - Fatal编程技术网

我是C+的新手+;我想知道如何进一步优化这段代码 我是C++的新手,我必须优化这个代码,使它在1.5秒内执行,输入值高达10 ^ 6。 但执行输入10^6需要3.52秒

我是C+的新手+;我想知道如何进一步优化这段代码 我是C++的新手,我必须优化这个代码,使它在1.5秒内执行,输入值高达10 ^ 6。 但执行输入10^6需要3.52秒,c++,optimization,C++,Optimization,我已经尝试了很多,并想出了这个代码 #包括 #包括 #包括 #包括 #包括 #包括 #包括 使用boost::multiprecision::cpp_int; 使用名称空间std; cpp_int gcd(cpp_int a、cpp_int b) { //万事皆分零 如果(a==0) 返回b; 如果(b==0) 返回a; //基本情况 如果(a==b) 返回a; //a更大 如果(a>b) 返回gcd(a-b,b); 返回gcd(a,b-a); } int main() { ios_base::

我已经尝试了很多,并想出了这个代码

#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用boost::multiprecision::cpp_int;
使用名称空间std;
cpp_int gcd(cpp_int a、cpp_int b)
{
//万事皆分零
如果(a==0)
返回b;
如果(b==0)
返回a;
//基本情况
如果(a==b)
返回a;
//a更大
如果(a>b)
返回gcd(a-b,b);
返回gcd(a,b-a);
}
int main()
{
ios_base::与_stdio同步(false);
cin.tie(空);
cpp_int t,ans;
标准:cin>>t;
而(t-->0){
cpp_int k;
标准:cin>>k;
cpp_int limit=(2*k)+1;
ans=0;
载体g1;
对于(int i=1;i
  • std::endl
    最好替换为
    '\n'
    std::endl
    刷新输出流,这不是一个便宜的操作,因为它忽略了缓冲输出的所有优点
  • g1.保留(最大大小)
    g1
    初始化之后。看起来您的
    g1
    向量在程序结束时足够大。向量是一个动态数组,这意味着一旦其容量不足,就会在堆中分配更大的内存并将现有元素复制到那里。此操作具有线性复杂度but很少执行。解决方案是首先使用命令
    g1告诉向量要保留的大小。reserve(MAX\u g1\u size)
    MAX\u g1\u size
    是程序评估后的最大g1大小。例如,我们可以将
    MAX\u g1\u size=t
  • 使gcd不递归。这通常不会加快速度,但可能会有所帮助
您事先没有内存,因此会遭受连续的重新分配,特别是当您有一个本地创建的
std::vector

将向量保持在循环之外允许重复使用以前分配的内存(您只需
清除
向量)。但是,在没有额外向量的情况下相处非常简单:

cpp_int n = k + 1;
for (int i = 2; i <= limit; ++i)
{
    cpp_int m = k + i * i; // if multiplication is costly: = m + i << 1 - 1
    ans += gcd(n, m);
    n = m;
}


模到达gcd的速度更快,此外,您还可以节省一些if(如果第一次调用时
a
为0或小于
b
,您将得到一个仅交换两个值的额外递归).

你能解释一下代码应该做什么吗?用
'\n'
替换
std::endl
,你就完成了。记住
std::endl
缓冲区刷新会减缓缓冲区引入的优化。“我是新手”和“我想优化”不要组合。首先,学好语言。然后获得一些经验。最终理解何时以及为什么需要优化,然后才进行优化。在优化方面,最大的挑战是抵制这样做的冲动。你应该分析你的代码(在启用优化的情况下构建)找出最重要的一两个瓶颈,并将精力集中在这些瓶颈上。请打破这种习惯。我也推荐。由于尾部调用优化,gcd递归性不会成为什么问题。
return b == 0 ? a : gcd(b, a % b);