检查数字是否为阿姆斯壮数字的时间复杂度

时间:2019-12-04 04:08:24

标签: algorithm language-agnostic time-complexity

我正在与朋友讨论算法的运行时间成本,以检查数字是否为阿姆斯特朗数字。只适合那些不知道阿姆斯壮号码是什么的人

  

数字?是阿姆斯特朗数字或自恋数字,如果它等于其自身数字的和乘以数字的幂。

这是我编写的检查号码是否为阿姆斯特朗号码的例程:

bool check_armstrong_number(int num){

   int number_copy = num; // Store the number in another variable to compare afterwards
   int digits = 0; // Stores the number of digits in the number.

   // Calculate the number of digits in the number
   while(number_copy){
    number_copy = number_copy/10;
    digits++;
   }

   number_copy = num;

   int sum = 0;  // To construct numbers from sum of digits raise to the power number_of_digits.
   while(num){
       int unit_digit = num % 10; // Get the unit digit with the help of modulus operator.
       sum  = sum + std::pow(unit_digit,digits);  // Calculate unit_digit^digits
       num = num / 10;
    }
    return (sum == number_copy); // Returns true only if sum equals original number
  }

我的朋友说算法是 O(log N) ,而我认为它是 O(log ^ 2(N))< / em> 。我认为对数字的迭代是 O(log N) 操作(因为整数中的数字位数是log N的顺序),以及std :: pow每次计算的(unit_digit,digits)也在 O(log N) 左右。因此,用于log N计算的 O(log N) 计算时间应在 O(log ^ 2 N) 附近>。有人可以澄清一下吗?

1 个答案:

答案 0 :(得分:1)

是O(log(n)* log(log(n))。
Log(n)进行迭代。
在pow(a,b)中,复杂度为log(b)。所以这里你的b = log(n)。
所以pow函数的log(log(n))。