在c++ 11中优化代码
Optimising a code in C++11
对于给定的正整数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
相关文章:
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- 需要消除这些"else if"并优化代码
- C/C++编译器是否会通过重用最近计算的函数结果来优化代码?
- 如何优化C 代码的以下片段 - 卷中的零交叉点
- C++按字符串调用函数,比较PHP的性能,如何在C++中优化代码
- 优化c++代码以添加两个作为字符串的数字
- x86 汇编和优化代码中的 for 循环
- 如何在gcc中设置模板功能的自动优化代码
- 优化代码/实现"for"循环而不是长"if - else if - else"
- 我的粒子群优化代码在 C++ 和 MATLAB 中生成不同的答案
- 优化代码以获取给定范围内可被整数整除的整数数
- if条件下两个字符串比较的优化代码
- Cuda Thrust - 如何使用sort_by_key、merge_by_key和reduce_by_key优化代码
- 如何优化代码中的参数
- 针对大量迭代优化代码
- 编译器在程序集中优化代码时会做什么?即O2标志
- 优化代码(康威的生命游戏)
- 用于 TSP 的 3 选项优化代码
- 如何使用 SSE 或 GLSL 优化"u[0]*v[0] + u[2]*v[2]"代码行
- 是否有任何情况将对象标记为 const 会导致更好的优化代码(使用优化编译时)