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を触ることが第一の目的だから、アルゴリズムはなるべく単純にする方針。

0 コメント:

コメントを投稿

関連コンテンツ