完美的力量

时间:2018-04-20 07:23:59

标签: c algorithm

我在一门课程中负责编写一个能够计算出功能完善的功能。例如这个数字。

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;
}

我的问题是:

  1. 有更好更简单的计算方法吗?

  2. 如何处理11111000等号码?

1 个答案:

答案 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因子就足够小了被视为一个不变因素。

您的第二个问题似乎是询问如何处理多个指数值正确的情况。那么,你选择哪一个真的很重要吗?您编码的功能似乎只是找出数字是否完美无功。那么,哪个指数满足该条件并不相关。如果要返回相关的指数,那么教师要澄清要返回的指数是一个问题。 (例如最小的,最大的等)