Il conto

Nicolino va a mangiare una pizza con i suoi amici dopo la partita di calcetto del martedì.
Prima che tutti si siedano attorno ad un tavolo circolare il proprietario del ristorante, per ravvivare l’atmosfera, li informa che offrirà la pizza ad uno dei commensali.
Viene scelto un numero N a caso e, cominciando da un posto indicato dal proprietario, si conta in senso orario fino alla N-esima persona, che è la prima persona eliminata (e che pagherà il conto).
Si conta nuovamente (nello stesso verso) a partire dal commensale successivo a quello eliminato, saltando il commensale eliminato, e si elimina la persona N-esima.
Si prosegue in questo modo, contando fino ad N (saltando gli eliminati) ed eliminando una nuova persona, finché non rimane una sola persona, che vince la pizza gratis.

Sapreste scrivere un programma che dica a Nicolino, dato il numero N ed il numero dei commensali C, in quale posizione sedersi a partire dalla persona da cui si inizia a contare per vincere la pizza gratis?

Dati in input

Il file input.txt è costituito da una sola riga contenente il numero di commensali C ed il numero N usato per la conta, separati da un carattere spazio.

Dati in output

Il programma, dopo aver letto il file di input, deve trovare la posizione del vincitore rispetto alla persona da cui si inizia a contare, e scriverla su un file di nome output.txt.
Si supponga che i commensali siano numerati a partire dalla persona da cui si inizia a contare nel verso del conteggio (cioè, il commensale 1 è quello da cui parte la conta).
Il file output.txt deve essere costituito da una sola riga, contenente il numero del commensale che vince la pizza gratis.

Assunzioni

  1. Il file di input non contiene altri caratteri oltre a quelli precisati.
  2. Il massimo numero C di commensali è 500, ed il massimo numero N usato per la conta è 100.

Esempio

Per C=9 e N=5, la sequenza degli eliminati è: 5 1 7 4 3 6 9 2.

Pertanto, i file di input ed output sono i seguenti:

input.txt output.txt
9 5 8

/*
    www.valcon.it
    OII 2001 - Fase nazionale - IL CONTO
*/

#include 

#define NMAX 500
#define ELIMINATO 1

int commensali[NMAX+1]; 
int C,             
    N;             

int numEliminati=0;
int contatore   =1;    

void prossimo()
{
	do
	{
		contatore++;
	    if(contatore == C+1)
		    contatore=1;
	}while(commensali[contatore]==ELIMINATO);
}

void fa_la_conta()   
{
    do                                    // elimina C-1 commensali
    {      
        for(int i=2; i <= N; i++)         // vai avanti di N-1 commensali
        {            
            prossimo();
        }
        commensali[contatore]=ELIMINATO;  // eliminato!!!
        numEliminati++;
        prossimo();                       // vai al prossimo per ricominciare a contare
    }                                     // se ha finito va al vincitore...
	while(numEliminati < C-1);        
}

int main()
{
    FILE *fin =fopen( "input.txt", "r");
    FILE *fout=fopen("output.txt", "w");
    
    fscanf(fin, "%d %d", &C, &N);    
    fa_la_conta();           
    fprintf(fout, "%d\n", contatore);
}