2019年2月21日木曜日

開発環境

Modern C++チャレンジ ―C++17プログラミング力を鍛える100問 (Marius Bancila(著)、島 敏博(監修)、黒川 利明(翻訳)、オライリージャパン)の1章(数学の問題)、問題7(友愛数)の解答を求めてみる。

コード

#include <iostream>

size_t sum_of_divisors(size_t n)
{
  size_t total = 0;
  for (size_t i = 1; i <= n / 2; i++)
  {
    if (n % i == 0)
    {
      total += i;
    }
  }
  return total;
}

int main()
{
  size_t upper = 1000000;

  std::cout << upper << "より小さい全ての友愛数のペア" << std::endl;

  size_t count = 0;
  for (size_t i = 1; i < upper; i++)
  {
    size_t sum_i = sum_of_divisors(i);
    if (sum_i < upper && i < sum_i && i == sum_of_divisors(sum_i))
    {
      count++;
      std::cout << count << "個目: (" << i << "," << sum_i << ")" << std::endl;
    }
  }
}

入出力結果(cmd(コマンドプロンプト)、Terminal)

Active code page: 65001

C:\Users\...>cl /O2 sample7.cpp && sample7.exe
Microsoft(R) C/C++ Optimizing Compiler Version 19.16.27027.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

sample7.cpp
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\xlocale(319): warning C4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりません。/EHsc を指定してください。
Microsoft (R) Incremental Linker Version 14.16.27027.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:sample7.exe
sample7.obj
1000000より小さい全ての友愛数のペア
1個目: (220,284)
2個目: (1184,1210)
3個目: (2620,2924)
4個目: (5020,5564)
5個目: (6232,6368)
6個目: (10744,10856)
7個目: (12285,14595)
8個目: (17296,18416)
9個目: (63020,76084)
10個目: (66928,66992)
11個目: (67095,71145)
12個目: (69615,87633)
13個目: (79750,88730)
14個目: (100485,124155)
15個目: (122265,139815)
16個目: (122368,123152)
17個目: (141664,153176)
18個目: (142310,168730)
19個目: (171856,176336)
20個目: (176272,180848)
21個目: (185368,203432)
22個目: (196724,202444)
23個目: (280540,365084)
24個目: (308620,389924)
25個目: (319550,430402)
26個目: (356408,399592)
27個目: (437456,455344)
28個目: (469028,486178)
29個目: (503056,514736)
30個目: (522405,525915)
31個目: (600392,669688)
32個目: (609928,686072)
33個目: (624184,691256)
34個目: (635624,712216)
35個目: (643336,652664)
36個目: (667964,783556)
37個目: (726104,796696)
38個目: (802725,863835)
39個目: (879712,901424)
40個目: (898216,980984)

C:\Users\...>

単純で、工夫、(コンパイラ以外による)最適化のないアルゴリズムだから求め終えるまでかなり時間がかかった。C++17を触ることが第一の目的だから、アルゴリズムはなるべく単純にする方針。

1 コメント :

式神自然数さんのコメント...

≪…友愛数…≫など自然数の本性を観るのに、射水市大島絵本館の「かおすのくにのかたなかーど」からの『幻のマスキングテープ』なる[数直線]で、[切り・繋ぎ]すると興味深い。

[数直線]は、自然数の[通過点表示]において、[偶結合]か[奇結合](パリティー結合)での連続性に思いを馳せるコトに生る。

この原型は、『HHNI眺望』で観る自然数の絵本
有田川町電子書籍「もろはのつるぎ」

御講評をお願い致します。

コメントを投稿