【发布时间】:2012-01-17 19:24:13
【问题描述】:
完美幂是一个数 N,其中 A^B = N (A >= 1 , B >= 2)
这是我的代码。我试图找出在 1 和我选择的上限之间存在多少这些数字。
static void Main(string[] args)
{
int PPwr_Count = 1; //number 1 is included by default.
int Top_Limit = 1000000; //Can be any number up to 10^9
for (int Number = 2; Number <= Top_Limit; Number++)
{
int myLog = (int)Math.Floor(Math.Log(Number, 2) + 1);
for (int i = 2; i <= myLog; i++)
{
//As a Math rule I only need to check below Base 2 Log of number
int x = Convert.ToInt32(Math.Pow(Number, 1.0 / i));
if (Number == Math.Pow(x, i))
{
PPwr_Count++;
break;
}
else continue;
}
}
}
目前正在运行。可悲的是,经过大约 1,000,000 次检查后,它变得相当缓慢。有什么办法可以提高这个算法的速度?
【问题讨论】:
-
Perfect power of two between two numbers 的可能重复项 --- 请参阅此以获得更好算法的示例。它特定于
2,但很容易适应。 -
@Yuck 我不确定如何轻松调整这些解决方案。该问题中的所有解决方案都使用二进制逻辑,它们之所以有效,是因为该问题专门询问了 2 的幂。在答案可能是 3 的幂的情况下,单独的二进制运算将不起作用。
-
假设 A 和 B 是整数,您可能需要考虑搜索 B 和 A 而不是搜索 N,因为要考虑的数字要少得多。这里棘手的边界情况是具有多个表示的数字(例如 4^2 = 2^4),因此您需要进行一些额外的排除,而不仅仅是检查 A^B
-
它不仅仅是 2 的幂,它是任何符合 A^B = N (A >= 1 , B >= 2) 的幂