I have this homework i have done with Jophseh problem but i need to complate this with Linked list [closed]
Power Crisis
During the power crisis in New Zealand this winter (caused by a shortage of rain and hence low levels in the hydro dams), a contingency scheme was developed to turn off the power to areas of the country in a systematic, totally fair, manner. The country was divided up into N regions (Auckland was region number 1, and Wellington number 13). A number, m, would be picked `at random', and the power would first be turned off in region 1 (clearly the fairest starting point) and then in every m'th region after that, wrapping around to 1 after N, and ignoring regions already turned off. For example, if N = 17 and m = 5, power would be turned off to the regions in the order:1,6,11,16,5,12,2,9,17,10,4,15,14,3,8,13,7.
The problem is that it is clearly fairest to turn off Wellington last (after all, that is where the Electricity headquarters are), so for a given N, the `random' number m needs to be carefully chosen so that region 13 is the last region selected.
Write a program that will read in the number of regions and then determine the smallest number m that will ensure that Wellington (region 13) can function while the rest of the country is blacked out.Input and Output
Input will consist of a series of lines, each line containing the number of regions (N) with . The file will be terminated by a line consisting of a single 0.
Output will consist of a series of lines, one for each line of the input. Each line will consist of the number m according to the above scheme. Sample input
17 0 Sample output
7
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int josephus( int n, int k, int s ) {
int ns, ans;
if ( n == 1 ) return 1;
ns= ((s + k - 2) % n) + 1;
ans= josephus( n - 1, k, ns );
return ans < ns? ans : ans+1;
}
int main( void ) {
int i, n= 17, m= 7;
char buf[100];
for ( ; ; ) {
printf( "Enter number of areas (N): " );
if ( fgets( buf, sizeof( buf ), stdin ) == NULL ) break;
if ( sscanf( buf, "%d", &n ) != 1 ) break;
for ( i= 1; i <= n; ++i ) {
int pos= josephus( n, i, n - i + 2 );
if ( pos == 13 ) {
printf( "N = %d, M = %d\n", n, i );
break;
}
}
if ( i <= n ) {
int *x= (int *) malloc( sizeof( int ) * n );
if ( x != NULL ) {
int j, z= n;
for ( j= 0; j < n; ++j ) x[j]= j+1;
j= 0;
do {
j %= z;
printf( " %d", x[j] );
memmove( x+j, x+j+1, sizeof( int ) * (n - j - 1) );
--z;
j += i - 1;
} while ( z > 0 );
putchar( '\n' );
free( x );
} else
printf( "Unable to allocate enough memory to compute final ordering.\n" );
} else
printf( "No valid result for M.\n" );
}
return 0;
}
Power Crisis
During the power crisis in New Zealand this winter (caused by a shortage of rain and hence low levels in the hydro dams), a contingency scheme was developed to turn off the power to areas of the country in a systematic, totally fair, manner. The country was divided up into N regions (Auckland was region number 1, and Wellington number 13). A number, m, would be picked `at random', and the power would first be turned off in region 1 (clearly the fairest starting point) and then in every m'th region after that, wrapping around to 1 after N, and ignoring regions already turned off. For example, if N = 17 and m = 5, power would be turned off to the regions in the order:1,6,11,16,5,12,2,9,17,10,4,15,14,3,8,13,7.
The problem is that it is clearly fairest to turn off Wellington last (after all, that is where the Electricity headquarters are), so for a given N, the `random' number m needs to be carefully chosen so that region 13 is the last region selected.
Write a program that will read in the number of regions and then determine the smallest number m that will ensure that Wellington (region 13) can function while the rest of the country is blacked out.Input and Output
Input will consist of a series of lines, each line containing the number of regions (N) with . The file will be terminated by a line consisting of a single 0.
Output will consist of a series of lines, one for each line of the input. Each line will consist of the number m according to the above scheme. Sample input
17 0 Sample output
7
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int josephus( int n, int k, int s ) {
int ns, ans;
if ( n == 1 ) return 1;
ns= ((s + k - 2) % n) + 1;
ans= josephus( n - 1, k, ns );
return ans < ns? ans : ans+1;
}
int main( void ) {
int i, n= 17, m= 7;
char buf[100];
for ( ; ; ) {
printf( "Enter number of areas (N): " );
if ( fgets( buf, sizeof( buf ), stdin ) == NULL ) break;
if ( sscanf( buf, "%d", &n ) != 1 ) break;
for ( i= 1; i <= n; ++i ) {
int pos= josephus( n, i, n - i + 2 );
if ( pos == 13 ) {
printf( "N = %d, M = %d\n", n, i );
break;
}
}
if ( i <= n ) {
int *x= (int *) malloc( sizeof( int ) * n );
if ( x != NULL ) {
int j, z= n;
for ( j= 0; j < n; ++j ) x[j]= j+1;
j= 0;
do {
j %= z;
printf( " %d", x[j] );
memmove( x+j, x+j+1, sizeof( int ) * (n - j - 1) );
--z;
j += i - 1;
} while ( z > 0 );
putchar( '\n' );
free( x );
} else
printf( "Unable to allocate enough memory to compute final ordering.\n" );
} else
printf( "No valid result for M.\n" );
}
return 0;
}
No comments:
Post a Comment