アームストロング数に関する説明です。
【説明】
Michael F. Armstrongにちなんだ*1アームストロング数はナルシシスト数、拡張完全
数(plus perfect number)、拡張完全桁不変数(pluperfect digital invariant)という呼び
名もありますが、ある数の桁数がnのとき、その数の各桁の数のn乗の総和が元の数と
等しい数です。例えば、3桁の最小のアームストロング数は153で13+53+33と等しく
なります。
3桁の数がアームストロング数かどうか調べるには、3乗して和を取る前にまず各桁
の数の値を求めなければなりません。そのためには、除算と剰余演算が必要になりま
すが、これよりも高速な方法があります。それは、10のべき乗を使って数を生成するも
のです。言い換えると、1000までの数をa10^2 + b10 + cと表します。3桁の数に限っ
ているので、aは1から始まります。除算や剰余演算より乗算のほうが速いので高速で
す。
【質問】
桁数に関わらず上限までのアームストロング数を求める構文の一部です。
構文内のstd::accumulateが4つの引数を持っていることで何をしているのかがわからず、
また、引数0の意味、s={return べき乗}の箇所が何をしようと知るのかがわかりません。
void print_narcissistics_3(int const limit, bool const printResults) { for (int i = 1; i <= limit; ++i) { std::vector<int> digits; int n = i; while (n > 0) { digits.push_back(n % 10); n = n / 10; } int arm = std::accumulate( std::begin(digits), std::end(digits), 0, [s = digits.size()](int const sum, int const digit) {return sum + static_cast<int>(std::pow(digit, s)); }); if (i == arm) { if (printResults) std::cout << arm << std::endl; } } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/07 03:59