在C ++ 11中优化代码

时间:2014-08-03 07:30:50

标签: c++ c++11

对于给定的正整数y(y> 1),如果我们可以找到最大整数k和最小正整数x,使得x ^ k = y,则y的幂被认为是k。< / p>

计算从a到b的整数幂的总和。 (2&lt; =&lt; = b&lt; = 10 ^ 18)

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

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

时间限制:11s

我制作了这段代码:

#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;

}

做出改变。需要进一步优化。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

这种问题并没有通过黑客代码解决。通过思考来解决问题。如果我给你数字a = 2和b = 10 ^ 18怎么办:你要检查多少个数字?我得到大约10 ^ 36。这应该清楚地表明你可以通过以下方式找到更快的方法(因为世界上没有计算机可以进行10 ^ 36计算,并且进行10 ^ 18计算将使一台体面的计算机忙于年)。

让我们直接进入案例a = 2,b = 10 ^ 18。几乎所有这些数字都有功率= 1.大约十亿有功率= 2.只有大约一百万个数字的功率&gt; = 3,你可以很快找到所有这些数字。这应该是一个暗示。

考虑一下:如果你的计算机有一条指令来计算一纳秒的数字x的功率,并且你将数字的功率从2增加到10 ^ 18,那需要多长时间?所以很明显这个不是解决方案。

答案 1 :(得分:1)

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

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

您是否还尝试在纸上写下算法的两次或三次迭代?

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