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

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

主站蜘蛛池模板: 蒲江县| 松溪县| 收藏| 文水县| 石河子市| 延川县| 延长县| 常宁市| 太仓市| 定襄县| 洛隆县| 滕州市| 涿鹿县| 庄浪县| 绩溪县| 五大连池市| 高台县| 阿拉善左旗| 安仁县| 得荣县| 怀柔区| 阿克苏市| 东城区| 哈密市| 神木县| 鄂州市| 来安县| 兴和县| 南涧| 东明县| 泸定县| 哈尔滨市| 绥化市| 新和县| 余姚市| 永州市| 忻州市| 贵南县| 海晏县| 勐海县| 罗定市|