aboutsummaryrefslogtreecommitdiff
path: root/challenge-159/ulrich-rieke/cpp/ch-1.cpp
blob: fd619c7af45fec7c34d4e7e471fdfe49f4bdc48b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <vector>
#include <iostream>
#include <numeric>
#include <utility>
#include <cstdlib>
#include <algorithm>

int main( int argc, char * argv[] ) {
  int n = std::atoi( argv[1] ) ;
  while ( n <= 0 ) {
      std::cout << "Please enter an integer greater than 0!\n" ;
      std::cin >> n ;
  }
  std::vector<int> numerators( n  ) ;
  std::vector<int> denominators( n + 1 ) ;
  std::iota( numerators.begin( ) , numerators.end( ) , 1) ;
  std::iota( denominators.begin( ) , denominators.end( ) , 0 ) ;
  std::vector<std::pair<int, int>> fractions ;
  fractions.push_back( std::make_pair( 0 , 1 ) ) ;
  for ( int i : numerators ) {
      for ( int j : denominators ) {
    if ( i < j && (std::lcm( i , j ) == i * j)) {
        fractions.push_back( std::make_pair( i , j )) ;
    }
      }
  }
  std::sort( fractions.begin( ) , fractions.end( ) ,
    []( const auto & a, const auto & b ) { return
    (static_cast<double>(a.first) / static_cast<double>(a.second)) <
    (static_cast<double>(b.first) / static_cast<double>(b.second));} );
  for ( auto & p : fractions )
      std::cout << p.first << '/' << p.second << ", " ;
  std::cout << "1/1" << std::endl ;
  return 0 ;
}