値が大きいので極力計算しない方向で
100100なんか計算してられないし。
何より、100100までの数字をチェックしないといけないなんて悪夢だ…。
重複を見る
例えば、24 と 42 は共に16で重複してる。
なぜ重複してるのかというと、4 = 22なので、
42
= (22)2
= 22×2
= 24
同じ底aで揃えた場合、同じ指数bになれば同じ数字だとわかる。
この場合、底と指数が違うのに計算結果が同じになるので、値のダブルチェックを回避する。
……とりあえず説明が凄くめんどくさいので、後はコードを見てください(手抜き)
コード
using System.Diagnostics; using System.Linq; namespace Problem29 { class Program { //範囲 static int min = 2; static int max = 100; static void Main(string[] args) { Debug.WriteLine(DistinctPowers()); } static int DistinctPowers() { bool[] findA = new bool[max + 1]; int sum = 0; for (int a = min; a <= max; a++) { if (findA[a] == false) { int b = maxB(a, findA); sum += NumberCount(b); } } return sum; } /// <summary> /// a^bの最も大きいbを調べる /// </summary> static int maxB(int a, bool[] findA) { int b = 0; for (int i = a; i <= max; i *= a) { findA[i] = true; b++; } return b; } /// <summary> /// b乗まである場合の出現個数を求める /// </summary> static int NumberCount(int b) { if (b == 1) return max - min + 1; bool[] findB = new bool[b * max + 1]; for (int d = 1; d <= b; d++) { for (int j = min * d; j <= d * max; j += d) { if (findB[j] == false) findB[j] = true; } } return findB.Where(obj => obj == true).Count(); } } }
結果
9183
ホント説明しにくいわ…。
ホワイトボードなんかで対話的にバーッと書いてやれるんならどれだけラクか。
坂田アキラの 指数・対数が面白いほどわかる本 (坂田アキラの理系シリーズ)
- 作者: 坂田アキラ
- 出版社/メーカー: KADOKAWA/中経出版
- 発売日: 2015/05/19
- メディア: 単行本
- この商品を含むブログを見る
- 作者: ダイヤモンド・ザイ編集部
- 出版社/メーカー: ダイヤモンド社
- 発売日: 2016/09/26
- メディア: Kindle版
- この商品を含むブログを見る
- 作者: ダニエル・ゴールマン,土屋京子
- 出版社/メーカー: 講談社
- 発売日: 1998/09/18
- メディア: 文庫
- 購入: 11人 クリック: 150回
- この商品を含むブログ (67件) を見る