annotate algs4-c++/src/Josephus.cpp @ 17:10e1ce04c4f1

The Josephus program, ex 1.3.37
author Eris Caffee <discordia@eldalin.com>
date Fri, 19 Jun 2015 18:18:47 -0500
parents
children
rev   line source
discordia@17 1 #include <algorithm>
discordia@17 2 #include <cstdlib>
discordia@17 3 #include <iostream>
discordia@17 4 #include <sstream>
discordia@17 5
discordia@17 6 #include "Queue.hpp"
discordia@17 7
discordia@17 8 void usage( char * name ) {
discordia@17 9 std::cerr << name << " skip size" << std::endl;
discordia@17 10 exit( EXIT_FAILURE );
discordia@17 11 }
discordia@17 12
discordia@17 13
discordia@17 14 int read_int( char *s ) {
discordia@17 15 std::stringstream ss;
discordia@17 16
discordia@17 17 ss.str( s );
discordia@17 18 int tmp;
discordia@17 19 ss >> tmp;
discordia@17 20 if ( ss.fail() ) {
discordia@17 21 return -1;
discordia@17 22 }
discordia@17 23 return tmp;
discordia@17 24 }
discordia@17 25
discordia@17 26 int main( int argc, char **argv ) {
discordia@17 27
discordia@17 28 if ( argc != 3 ) {
discordia@17 29 usage( argv[0] );
discordia@17 30 }
discordia@17 31
discordia@17 32 int skip = read_int( argv[1] );;
discordia@17 33 int size = read_int( argv[2] );
discordia@17 34 if ( skip == -1 || size == -1 ) {
discordia@17 35 usage( argv[0] );
discordia@17 36 }
discordia@17 37
discordia@17 38
discordia@17 39 Queue<int> q;
discordia@17 40
discordia@17 41 for ( int i = 0; i < size; ++i ) {
discordia@17 42 q.enqueue( i );
discordia@17 43 }
discordia@17 44
discordia@17 45 int i = 0;
discordia@17 46 while ( q.size() ) {
discordia@17 47 int tmp = q.dequeue();
discordia@17 48 if ( (i+1) % skip )
discordia@17 49 q.enqueue( tmp );
discordia@17 50 else
discordia@17 51 std::cout << tmp << std::endl;
discordia@17 52 ++i;
discordia@17 53 }
discordia@17 54
discordia@17 55 }