官术网_书友最值得收藏!

8. Armstrong numbers

An Armstrong number (named so after Michael F. Armstrong), also called a narcissistic number, a pluperfect digital invariant, or a plus perfect number, is a number that is equal to the sum of its own digits when they are raised to the power of the number of digits. As an example, the smallest Armstrong number is 153, which is equal to .

To determine if a number with three digits is a narcissistic number, you must first determine its digits in order to sum their powers. However, this involves pision and modulo operations, which are expensive. A much faster way to compute it is to rely on the fact that a number is a sum of digits multiplied by 10 at the power of their zero-based position. In other words, for numbers up to 1,000, we have a*10^2 + b*10^2 + c. Since you are only supposed to determine numbers with three digits, that means a would start from 1. This would be faster than other approaches because multiplications are faster to compute than pisions and modulo operations. An implementation of such a function would look like this:

void print_narcissistics()
{
for (int a = 1; a <= 9; a++)
{
for (int b = 0; b <= 9; b++)
{
for (int c = 0; c <= 9; c++)
{
auto abc = a * 100 + b * 10 + c;
auto arm = a * a * a + b * b * b + c * c * c;
if (abc == arm)
{
std::cout << arm << std::endl;
}
}
}
}
}

You could take it as a further exercise to write a function that determines the narcissistic numbers up to a limit, regardless their number of digits. Such a function would be slower because you first have to determine the sequence of digits of the number, store them in a container, and then sum together the digits raised to the appropriate power (the number of the digits).

主站蜘蛛池模板: 乌恰县| 东乡县| 崇仁县| 石林| 新巴尔虎左旗| 潮州市| 宝兴县| 和田市| 通渭县| 康定县| 郓城县| 文昌市| 乳山市| 永嘉县| 石林| 喜德县| 阳江市| 泰宁县| 阿拉尔市| 象州县| 桂阳县| 辽中县| 平昌县| 宽甸| 钟山县| 宿迁市| 祁阳县| 西畴县| 长治县| 亳州市| 莱芜市| 从化市| 六盘水市| 商河县| 浪卡子县| 淮滨县| 庄浪县| 洪泽县| 施甸县| 大同县| 长子县|