对于给定的正整数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;
}
做出改变。需要进一步优化。有什么建议吗?
答案 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)
由于这似乎是作业,我不会给你一个实现,只是一些提示:
x^(k+1) = x^k * x
(巧妙地初始化temp然后在每次迭代时将其乘以x)这一事实。if ( i!= 0 && j != 0 )
并离开内部if 2<i<j<10^18
)您是否还尝试在纸上写下算法的两次或三次迭代?
提示:http://www.trans4mind.com/personal_development/mathematics/series/sumGeneralPowersNaturalNumbers.htm