在c++ 11中优化代码

Optimising a code in C++11

本文关键字:优化 代码 c++      更新时间:2023-10-16

对于给定的正整数y(y> 1),若能找到最大整数k和最小正整数x,使x^k=y,则将y的幂视为k。

求a到b整数的幂和(2<= a <= b <=10^18)

对于每个测试用例,有一行包含两个整数a和b。

输入结束由包含两个0的行表示。

时间限制:11秒

我写了这样的代码:

#include <iostream>
#include <cmath>
using namespace std;
int main (void)
{
    long long i,j,count;
    while (1)
    {
        cin>>i>>j;
        count = 0;
        if ( i!= 0 && j != 0 )
        {
            if ( i > 1 && j > 1 )
            {
                while ( i <= j )
                {
                    long long temp = -9999;
                    long long x = 2L;
                    long long k = 0L;
                    while ( temp != i )
                    {
                        temp = pow(x,k);
                        if ( temp > i )
                        {
                            x++;
                            k = 0;
                        }
                        else if ( temp == i )
                        {
                            break;
                        }
                        else
                            k++;
                    }
                    count = count + k;
                    i++;
                }
             cout<<count<<"n";
            }
        }
        else if ( i == 0 && j == 0 )
            break;      
    }
    return 0;
}

基本上,从2到得到满足所需条件的数,我计算这些数。这超出了时间限制。有更好的方法吗?

谢谢!:)

编辑:

#include <iostream>
#include <cmath>
using namespace std;
int main (void)
{
    long long i,j,count;
    while (1)
    {
        cin>>i>>j;
        count = 0;
        if ( i == 0 && j == 0 )
            break;
        else
        {
            if ( i > 1 && j > 1 )
            {
                while ( i <= j )
                {
                    long long x = 2;
                    long long k = 1;
                    long long temp = 1;
                    while ( temp != i )
                    {
                        temp = temp*x;
                        if ( temp > i )
                        {
                            x++;
                            k = 1;
                        }
                        else if ( temp == i )
                        {
                            break;
                        }
                        else
                            k++;
                     }
                    count = count + k;
                    i++;
                }
            cout<<count<<"n";
            }
    }
}
return 0;

}

进行更改。需要进一步优化。有什么建议吗?

这种问题不能通过一起破解代码来解决。它是通过思考来解决的。如果我给你数字a = 2和b = 10^18,你会检查多少个数字?得到10^36。这应该清楚地表明,你可以找到一些方法,通过思考,这是非常快的(因为世界上没有计算机可以做10^36的计算,而做10^18的计算会让一台体面的计算机忙碌一年)。

我们直接看a = 2 b = 10^18的情况。几乎所有这些数的幂都是1。大约有10亿人的power = 2。幂>= 3的数大约只有一百万个,你可以很快找到它们。这应该是足够的暗示了。

想想看:如果你的计算机有一条指令可以在一纳秒内计算一个数字x的幂,然后你把这些数字的幂从2加到10的18次方,这需要多长时间?所以很明显,这个不是解决方案。

由于这似乎是作业,所以我不会给您一个实现,只提供一些提示:

  • 在while循环中,不应该对每次迭代使用pow(x, k),而应该使用x^(k+1) = x^k * x(巧妙地初始化temp,然后在每次迭代中将其乘以x)
  • 您的两个if是多余的,您可以简单地删除if ( i!= 0 && j != 0 )并留下内部if
  • 为了使你的代码更清晰、更容易阅读,你应该声明函数。在这种情况下,计算X幂和的函数将隔离内部while循环。
  • 您应该检查输入(2<i<j<10^18)的有效性

你是否也试着在论文上写下算法的两到三次迭代是什么?

提示:http://www.trans4mind.com/personal_development/mathematics/series/sumGeneralPowersNaturalNumbers.htm