El lenguaje C sale del círculo Nankai 100-57
El problema del exterior de un círculo es un problema difícil en el lenguaje C de nivel 3. Muchos candidatos le tienen miedo. Hay dos tipos de preguntas de deformación. Las principales diferencias son las siguientes:
Los requisitos de significado de la pregunta en el sistema de examen por computadora: el número del primer círculo se almacena en p[0] y el número de el segundo círculo se almacena en p[1], el número del enésimo círculo se almacena en p[n-1].
Los requisitos de significado de las preguntas informáticas de Nankai o las preguntas informáticas sin preocupaciones: si la I-ésima persona cuenta y gira en círculos, p [i] se colocará en la I-ésima posición desde la parte inferior de la matriz y el original i +1 al I-ésimo elemento se mueven hacia adelante una posición en secuencia, es decir, el número del primer círculo exterior se almacena en P [n-1] y el número del segundo exterior; El círculo se almacena en p[n-2] hasta que El número del enésimo círculo exterior se almacena en p[0].
En consecuencia, las funciones de datos escritos () en los dos programas también han sufrido los cambios correspondientes:
El rendimiento del sistema del centro de examen es el siguiente:
void WriteDat (void)
{
int i, j = 0;
ARCHIVO * fp
fp = fopen("fuera .dat "," w ");
for(I = 0;I<= N-1;I++) /*Aquí está el bucle de 0 a N-1*/
{printf("%4d", p[I]);
fprintf(fp, "%4d", p[I]);
j++;/* j's El El valor se incrementa en 1 para evitar el 0% 10 == 0 en la siguiente declaración condicional para que el primer número se separe en una línea. */
if(j % 10 == 0) {
printf(" \ n ");
fprintf(fp, " \ n "); ") ;
}
}
fclose(FP);
}
Nankai y Wuyou preguntaron las siguientes preguntas:
void WriteDat(void)
{
int I;
FILE * fp
fp = fopen("jose.out", "w");
for(I = N-1;I>=0;I-)/*Aquí está el bucle de N-1 a 0 */
{ printf("%4d ", p[I]);
fprintf(fp, " %4d ", p[I]); p> if(i % 10 == 0) {
printf(" \ n "
fprintf(fp, " \ n "); >}
}
fclose(FP);
}
Las siguientes son soluciones a los dos tipos de problemas; consulte a ellos.
********************************************* *** ************************************************* **** ****************
★Tema 57 (tema rodeado por Wuyou ID 109)
Hay n personas sentadas en un círculo, numerando en el sentido de las agujas del reloj de 1 a n, contando desde s persona hasta 1 hasta m personas, contando hasta m personas y luego contando desde la siguiente persona hasta 1 hasta m, y así sucesivamente hasta que todos estén fuera del círculo. Ahora se nos pide que demos la lista de orden de estas n personas en un grupo de 10 personas en orden circular. Los candidatos deben escribir la función Josegh() para implementar la función y llamar a la función WriteDat() para generar el resultado p.
Entrar en ficha José. Afuera
Supongamos n = 100, s = 1, m = 10.
(1) Almacene los números de serie de 1 a n personas en la matriz unidimensional p;
(2) Si la I-ésima persona informa el número y lo rodea con un círculo, poner p[i] En la posición I-ésima desde la parte inferior de la matriz, el i+1 original hasta el elemento I-ésimo se mueve hacia adelante una posición en secuencia;
(3) Repita el paso ( 2) hasta que solo quede p[1].
Nota: Algunos programas fuente se almacenan en el archivo prog1.c
No cambie el contenido de la función principal () y la función de datos de salida WriteDat ().
# include & ltstdio.h & gt
#Definición número 100
#Definición S 1
#Definición M 10 p>
int p[100], n, s, m;
void WriteDat(void);
void Josegh(void)
{ int i, j, s1, w;
s 1 = s;
for(I = 1;i<= n;i++)
p [I -1]= I;
for(I = n;I>=2;I-)
{ s 1 =(s 1+m-1)%I; p>
si(s 1 = = 0)s 1 = I;
w = p[s 1-1];
for(j = s 1;j<I ;j++)
p[j-1]= p[j];
p[I-1]= w;
}
}
void main()
{
m = M
n = N
s = S
José GH();
escribir dat();
}
void WriteDat(void)
{
int I;
ARCHIVO * fp
fp = fopen("jose.out "," w ");
for(I = N-1; i & gt= 0; i-) {
printf("%4d ", p[I]);
fprintf (fp, " %4d ", p[I]);
if(i % 10 == 0) {
printf(" \ n ");
fprintf(fp, "\n");
}
}
fclose(FP);
p>
}
*************************************** *** ************************************************* **** **********************
Otra forma de esta pregunta (pregunta de prueba real en computadora)
Sí, n personas se sientan en un círculo, numeradas en el sentido de las agujas del reloj del 1 al n, cuentan del sa al 1 al m, cuentan al m, luego cuentan del 1 al m desde la siguiente persona, y así sucesivamente, hasta que todos estén fuera del círculo. . Ahora debemos dar la lista de orden p de estas n personas en orden circular. Los candidatos deben escribir la función Josegh() para implementar la función y llamar a la función WriteDat() para enviar el número a OUT. Los archivos DAT están organizados en orden circular.
Nota: El número del primer bucle se almacena en p[0], el número del segundo bucle se almacena en p[1], hasta que el número del enésimo bucle se almacena en p [n-1] pulg.
Supongamos n = 100, s = 1, m = 10 para programación.
Nota: Parte del programa fuente se almacena en PROG1. C
No cambie el contenido de la función principal () y la función de datos de salida WriteDat().
# include & ltstdio.h & gt
#Definición número 100
#Definición S 1
#Definición M 10 p>
int p[100], n, s, m;
void WriteDat(void);
void Josegh(void)
{ int i,j,s1,w,q[100];
for(I = 0;i<n;i++)q[I]= 0;
s 1 = s;
for(I = 1;i& lt= n;i++)p[I-1]= I;
for(I = n;i>=2 ;i-)
{ s 1 =(s 1+m-1)%I
si(s 1 = = 0)s 1 = I
w =; p[s 1-1];
for(j = s 1;j<i;j++)p[j-1]= p[j];
p[I-1 ]= w;
}
/*Dado que la solución anterior es almacenar el número de círculos hacia atrás, se utilizan los dos bucles siguientes para invertir los datos en la matriz P para cumplir los requisitos del problema, es decir, el número del primer círculo se almacena en p [0] y el número del segundo círculo se almacena en P [1], hasta que el número de n círculos se almacena en P [ n-65438].
*/
for(i=0,j=n-1;i<n,j>=0;I++,j-)/*también se puede cambiar a for(i=0,j= n-1 ;i<n;i++,j-) */
q[j]= p[I];
for(I = 0;i<n;i++ )
p[I]= q[I];
}
void main()
{
m = M p>
n = N
s = S
José GH();
escribe dat();
}
Void WriteDat(void) /*Tenga en cuenta la diferencia entre esta función en las dos preguntas*/
{
int i, j = 0; p>
ARCHIVO * fp
fp = fopen("out.dat", "w");
for(I = 0; i & lt= N-1 ; i++) {
printf("%4d ",p[I]);
fprintf(fp," %4d ",p[I]);
j++;
if(j % 10 == 0) {
printf(" \ n ");
fprintf(fp, "\n");
}
}
fclose(FP);
}
* ************************************************** * ************************************************* ** *************************
Los resultados del archivo de salida de los dos programas son los mismos, como se muestra a continuación:
10 20 30 40 50 60 70 80 90 100
11 22 33 44 55 66 77 88 99 12
24 36 48 61 73 85 97 9 25 38
52 65 79 93 6 21 37 53 68 83
98 15 31 47 64 82 1 17 35 56
74 92 13 32 54 75 95 18 42 63
87 8 39 62 89 16 45 72 3 29
67 96 28 69 4 43 81 23 59 7
57 5 58 19 78 41 2 84 51 46 p>
34 49 76 94 71 27 91 14 86 26
El examen puede no ser la versión Nankai, sino la última versión.
Se recomienda descargar la versión Amuyi de Nankai Baiwen. Esta es la mejor versión del problema, creo.