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

  • The Modern C++ Challenge
  • Marius Bancila
  • 341字
  • 2021-06-25 22:01:24

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).

主站蜘蛛池模板: 乌兰浩特市| 西和县| 华安县| 石狮市| 台中县| 邵武市| 巴中市| 呼伦贝尔市| 靖边县| 沙河市| 乾安县| 舟山市| 藁城市| 调兵山市| 垫江县| 孝昌县| 荣成市| 建宁县| 大同市| 大同市| 时尚| 宁南县| 焦作市| 南城县| 永顺县| 兴山县| 惠来县| 滦南县| 威信县| 黄梅县| 高清| 黎平县| 忻城县| 五大连池市| 额济纳旗| 庄浪县| 辽阳市| 修文县| 富锦市| 合阳县| 济源市|