C++ 优化C+中的代码+;11

C++ 优化C+中的代码+;11,c++,c++11,C++,C++11,对于给定的正整数y(y>1),如果我们能找到一个最大的整数k和一个最小的正整数x,使得x^k=y,那么y的幂就是k 计算从a到b的整数的幂和。(2>j; 计数=0; 如果(i!=0&&j!=0) { 如果(i>1&&j>1) { 而(i) { x++; k=0; } 否则如果(温度==i) { 打破 } 其他的 k++; } 计数=计数+k; i++; } coutj; 计数=0; 如果(i==0&&j==0) 打破 其他的 { 如果(i>1&&j>1) { 而(i) { x++; k=1; }

对于给定的正整数y(y>1),如果我们能找到一个最大的整数k和一个最小的正整数x,使得x^k=y,那么y的幂就是k

计算从a到b的整数的幂和。(2>j; 计数=0; 如果(i!=0&&j!=0) { 如果(i>1&&j>1) { 而(i) { x++; k=0; } 否则如果(温度==i) { 打破 } 其他的 k++; } 计数=计数+k; i++; } coutj; 计数=0; 如果(i==0&&j==0) 打破 其他的 { 如果(i>1&&j>1) { 而(i) { x++; k=1; } 否则如果(温度==i) { 打破 } 其他的 k++; } 计数=计数+k; i++; }
cout因为这似乎是一个家庭作业,我不会给你一个实现,只是一些提示:

  • 在while循环中,不应在每次迭代中使用pow(x,k),而应使用
    x^(k+1)=x^k*x
    (巧妙地初始化temp,然后在每次迭代中将其乘以x)
  • 您的两个if是冗余的,只需删除
    if(i!=0&&j!=0)
    并保留内部if即可
  • 为了使代码更简洁易读,您应该声明函数。在这种情况下,计算X的幂和的函数将隔离内部while循环

  • 您应该检查输入的有效性(
    2这种问题不是通过一起破解代码来解决的。它是通过思考问题来解决的。如果我给你数字a=2和b=10^18会怎么样:你要检查多少个数字?我得到大约10^36。这应该清楚地表明,你可以通过思考找到一种更快的方法(因为世界上没有一台计算机能做10^36次计算,而做10^18次计算会让一台像样的计算机忙碌一年)

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


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

    这个问题似乎离题了,因为它只是为了确保每个人都能理解这也是同样的问题,你应该在这里为两个给定的值a和b设置一个示例输出“为了让你的代码更简洁易读,你应该声明函数。在这种情况下,一个计算X的幂和的函数将隔离内部while循环。”-一般来说,当然,但考虑到OP需要缩短运行时间,我不确定这是否是最好的建议。至少要确保它们是内联的。让编译器内联函数并决定什么更快。在我看来,干净的代码总是更容易优化。好吧,我一直致力于图像处理代码,其中我必须进行调整使用内部循环来消除函数调用开销,因此您不能总是盲目地相信编译器来解决您的潜在问题我建议不要使用函数,但当我试图快速编写代码块时,添加抽象肯定不是我的第一项任务。这是对已经了解所有这些的专业人士的好建议,对正在学习算法的学生的坏建议他对代码进行了优化。
    #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;
    }
    
    #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;