• ベストアンサー

約数

次の数以下で最も約数が多い数と約数の個数(1とその数含め)を教えて下さい 1,000 約数が多い数840 個数32 (1)10,000 (2)100,000 (3)1,000,000

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

反則かもしれませんが、単純にプログラム組んで(Scala) 全数の約数の数を力業で調べました。 なんの工夫もないので 20分位かかりました(^^; (1) 7560, 9240 で 64個 (2) 83160, 98280 で 128個 (3) 720720, 831600, 942480, 982800, 997920, 240個 No.3 さんと同じ答えなので、多分どちらも正解でしょう。 以下がプログラムです。マイナーな言語ですいません。 #マイナーといても Twitter の記述言語ですが・・・ import scala.collection.mutable.ArrayBuffer import scala.util.control.Breaks._ ---------- scala プログラム ここから(100万の場合) ---------- object Main { def isPrime(i: Int): Boolean = { if (i <= 3) true else { val max = (math.sqrt(i) + 0.5).toInt; for (j <- 2 to max) { if (i % j == 0) return false } return true } } def main(args: Array[String]): Unit = { val primes = ArrayBuffer[Int]() var maxDivisors = 0; for (i <- 2 to 1000000) { if (isPrime(i)) { primes.append(i); } } println("素数の数 = " + primes.length) for (i <- 2 to 1000000) { var degrees = List[Int]() breakable { for (j <- 0 until primes.length) { if (primes(j) > i) break; var degree = 0 var k = i while (k % primes(j) == 0) { degree += 1 k = k / primes(j) } if (degree != 0) { degrees = degrees :+ degree //println(primes(j) + ", " + degree) } } } var divisors = 1 for (degree <- degrees) { divisors *= degree + 1 } if (divisors >= maxDivisors) { printf("i = %d, Total = %d\n", i, divisors) maxDivisors = divisors } } } }

ulti-star
質問者

お礼

回答ありがとうございました

その他の回答 (3)

回答No.4

No.3です。(3)を10秒程度で求められるように改良しました。 import scala.collection.mutable.ArrayBuffer import scala.util.control.Breaks._ object Main { def isPrime(i: Int): Boolean = { if (i <= 3) true else { val max = (math.sqrt(i) + 0.5).toInt; for (j <- 2 to max) { if (i % j == 0) return false } return true } } def main(args: Array[String]): Unit = { var maxDivisors = 0; val primes = 2 to 1001 filter { isPrime(_) } println("素数の数 = " + primes.length) for (i <- 2 to 1000000) { var degrees = List[Int]() var k = i var max = (math.sqrt(k) + 0.1).toInt breakable { for (j <- 0 until primes.length) { if (primes(j) > max) { if (k > 1) { degrees = degrees :+ 1 } break; } var degree = 0 while (k % primes(j) == 0) { degree += 1 k = k / primes(j) } if (degree != 0) { degrees = degrees :+ degree } } } var divisors = 1 for (degree <- degrees) { divisors *= degree + 1 } if (divisors >= maxDivisors) { printf("i = %d, Total = %d\n", i, divisors) maxDivisors = divisors } } } }

ulti-star
質問者

お礼

回答ありがとうございました。

  • momordica
  • ベストアンサー率52% (135/259)
回答No.2

> 1,000 約数が多い数840 個数32 「1000以下の自然数で最も約数が多い数は840で、その約数の個数は32個」 という意味ですよね。 1万、10万、100万以下の場合、それぞれ同じ最大個数になる数が複数あるようですが、 (1)  7560 = 2^3 * 3^3 * 5 * 7  9240 = 2^3 * 3 * 5 * 7 * 11   約数の個数は64個 (2)  83160 = 2^3 * 3^3 * 5 * 7 * 11  98280 = 2^3 * 3^3 * 5 * 7 * 13   約数の個数は128個 (3)  720720 = 2^4 * 3^2 * 5 * 7 * 11 * 13  831600 = 2^4 * 3^3 * 5^2 * 7 * 11  942480 = 2^4 * 3^2 * 5 * 7 * 11 * 17  982800 = 2^4 * 3^3 * 5^2 * 7 * 13  997920 = 2^5 * 3^4 * 5 * 7 * 11   約数の個数は240個 でいいかと思います。 違ってたらすみません。

ulti-star
質問者

お礼

回答ありがとうございました

  • spring135
  • ベストアンサー率44% (1487/3332)
回答No.1

>1,000 約数が多い数840 個数32 意味不明です。国語になっていません。もちろん数学にも。

ulti-star
質問者

お礼

回答ありがとうございました

関連するQ&A