我正在与朋友讨论算法的运行时间成本,以检查数字是否为阿姆斯特朗数字。只适合那些不知道阿姆斯壮号码是什么的人
数字?是阿姆斯特朗数字或自恋数字,如果它等于其自身数字的和乘以数字的幂。
这是我编写的检查号码是否为阿姆斯特朗号码的例程:
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) 附近>。有人可以澄清一下吗?
答案 0 :(得分:1)
是O(log(n)* log(log(n))。
Log(n)进行迭代。
在pow(a,b)中,复杂度为log(b)。所以这里你的b = log(n)。
所以pow函数的log(log(n))。