pta ejercicios 8-4 reportan el número

Un problema de agua que se atascó debido a problemas de pensamiento.

Enlace del título original

tema

El juego de contar es así: hay n personas en un círculo y los números están numerados del 1 al n en orden. Empiece a contar desde la primera persona, y aquellos que se reportan am (<n) salen del círculo; la siguiente persona comienza a contar desde 1, y aquellos que reportan am salen del círculo. Esto continúa hasta que queda la última persona.

Esta pregunta requiere escribir una función, dando el número de orden de salida de cada persona.

Definición de interfaz de función

void CountOff (int n, int m, int out []);

Donde n es el número inicial de personas; m es el orden de salida especificado por el juego (se garantiza que es un número entero positivo menor que n). La función CountOff almacena el número de orden de salida de cada persona en la matriz out []. Debido a que el subíndice de matriz de lenguaje C comienza desde 0, la persona en la posición i-ésima está fuera [i-1] -ésima salida.

Ejemplo de procedimiento de prueba de árbitro

#include <stdio.h>
#define MAXN 20

void CountOff( int n, int m, int out[] );

int main()
{
    
    
    int out[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    CountOff( n, m, out );   
    for ( i = 0; i < n; i++ )
        printf("%d ", out[i]);
    printf("\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

Muestra de entrada

11 3

Salida de muestra

4 10 1 7 5 2 11 9 3 6 8

El malentendido de pensamiento en el que es fácil caer en esta pregunta es creer erróneamente que el resultado es el número de la persona eliminada en orden (es decir, el resultado de la muestra debe ser 3, 6, 9 ...)
y el resultado real debe será el número de rondas que se elimina el número correspondiente (muestra de salida Entre ellas, 1, 2, 3 representan el número de rondas, representando la eliminación de la persona numerada 3 en la primera ronda, y así sucesivamente)
Será mucho más fácil para entender el principio de salida ~

Código:


void CountOff( int n, int m, int out[] )
{
    
    

    int j=0,count=0,item=0;
    for(int i=0;i<n;i++)
		out[i]=0;//数组初始化
    while(1){
    
    
		if(out[j++]==0)
			count++;
		if(count==m){
    
    
	    	item++;
			out[j-1]=item;
			count=0;
		}
		if(item==n)
			break;//当仅剩最后一人时 跳出while循环
		j=j%n;
	}
}

Supongo que te gusta

Origin blog.csdn.net/laysan/article/details/114960606
Recomendado
Clasificación