我在一门课程中负责编写一个能够计算出功能完善的功能。例如这个数字。
153 = 1^3+5^3+3^3
到目前为止,我已尝试过以下代码。
int CheckIfPrefectInPower(int n)
{
int i, sum=0, userInput;
// Deals with the Power exponent
for (i = 0; sum<n; i++)
{
userInput = n;
sum = 0;
while(userInput>0)//the loop calculate the sum
{
sum += pow((double)(userInput % 10), (double)i);
userInput = userInput / 10;
}
if (sum == n)
{
return 1;
}
}
return 0;
}
我的问题是:
有更好更简单的计算方法吗?
如何处理1111
或1000
等号码?
答案 0 :(得分:1)
让我们从你的第一个问题开始吧。您的代码线性会尝试找出指数i
,以便所有d^i
的总和等于n,其中d
代表数字的数字{ {1}}你得到了。因此,对于您要查找的指数值为n
的情况,您的算法必须迭代E
次,导致时间复杂度为E
。 (即由于内部while循环而添加了O(E * log(n))
因子)
由于其对数时间复杂性,人们可能会认为二进制搜索方法会导致更快的解决方案。但是,事实证明,在这种情况下,二进制搜索不会为您提供更好的解决方案。
假设数log
小于或等于最大的32位有符号整数值。然后,在最坏的情况下(例如n
),它将保持n = 2^31 - 1
。即使整数是64位无符号整数,也可以看出k < 31
成立。
因此,即使二进制搜索的时间复杂度优于与线性搜索方法相比,实际上,您的算法效率也不高,主要是由于搜索空间太小。 (即k < 64
用于32位有符号整数)换句话说,只要你使用n的基本数据类型,我在算法的初始时间复杂度中提到的0 <= k < 31
因子就足够小了被视为一个不变因素。
您的第二个问题似乎是询问如何处理多个指数值正确的情况。那么,你选择哪一个真的很重要吗?您编码的功能似乎只是找出数字是否完美无功。那么,哪个指数满足该条件并不相关。如果要返回相关的指数,那么教师要澄清要返回的指数是一个问题。 (例如最小的,最大的等)