Usa pascal para encontrar el día de la semana en el que es el 13 de cada mes de este año.
Análisis
Calculado mensualmente y cálculos simulados, el 13 de enero de 1900 es sábado (código 1), y el día 13 del mes siguiente es el código (1 31- 1 ) mod 7 1 de la semana.
Debido a que los datos son pequeños, no caducarán.
Cuando los datos son relativamente grandes, se pueden calcular en unidades de años. Cada año tiene 365 días. El resto del mod 7 es 1, lo que significa que cada año, todos los días y semanas son incorrectos. un día. En los años bisiestos, el primer y el último día están mal. Un día estuvo mal en febrero y dos días después de marzo. De esta manera, sólo necesitamos encontrar la solución para el primer año y agregar la dislocación a los años siguientes.
Análisis detallado: Debido a que 1900.1.1 es lunes, 1900.1.13 es igual a (13-1) mod7 1=sábado. Puede que no quede claro decirlo de esta manera. Bueno, déjame explicarte: cada 7 días es una semana. ¿Cómo calcular el día de la semana después de n días? Ahora supongamos que n es múltiplo de 7. Si n es 14, entonces han pasado exactamente dos semanas, por lo que sigue siendo lunes después de 14 días. Pero si es 15 días después, se calcula que será el martes. De esta manera, podemos derivar una fórmula para calcular. (n días mod 7 (el número de días de una semana) el código de la fecha actual) mod 7 es igual al código de la fecha actual. Cuando el valor entre paréntesis es múltiplo de 7, su código es 0. Entonces debería ser domingo. De esta forma podemos obtener el algoritmo de la pregunta:
int a[13]=. {0 , 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
int b[8]={0}
una matriz Guarde el número de días en 12 meses de un año (debido a que el índice inicial de la matriz en lenguaje C es 0, por lo que aquí se define como 13).
La matriz b almacena el número de días de lunes a domingo. Use la fecha para registrar el código del día actual de la semana y luego use dos bucles para agregar el número de días del mes pasado para averiguar el día de la semana de ese mes. Por supuesto, preste atención al año bisiesto. ! Una vez que conozca este método, será fácil de implementar.
Presta atención a la situación de los meses bisiestos.
Finalmente, asegúrese de ajustar la línea; de lo contrario, se producirá un error.
También puedes usar la fórmula de Zeiller
Código fuente
Método 1
{sin la fórmula de Zeiller}
programa cinco001;
var
semana: matriz[0..6]de Entero Largo;
n, i, j, x, s, días, nk , m: Entero largo;
comenzar
asignar(entrada, 'viernes.in'); restablecer
asignar(salida, 'viernes . fuera'); reescribir(salida);
readln(n);
nk:=1; m:=0; p> para i: = 1900 a 1900 n-1 hacer
comenzar
para j: = 1 a 12 hacer
comenzar
caso j de
1, 3, 5, 7, 8, 10, 12: días: = 31
4, 6, 9, 11: días: = 30 ;
2: si (i mod 4 = 0)y(i mod 100 lt; gt; 0)o (i mod 400 = 0)
entonces días: =29< / p>
demás días: =28;
fin
semana[(x nk-1) mod 7]: =semana[(x nk-1) mod 7 ] 1;
m:=días mod 7;
s:=nk;
si s m=7 entonces nk:=7;
nk:=(m s) mod 7;
fin;
fin
writeln(semana[6], ' ', semana[ 0 ], ' ', semana[1], '', semana[2], '', semana[3], '', semana[4], '', semana[5]);
close(entrada); close(salida);
end.
Método 2
{Código escrito basado en la fórmula de Zeiler.
}
var
n, i, j, año, m, c, y, w: entero largo
a: matriz[0..6] de longint;
comenzar
Assign(entrada, 'Viernes.in'); ); reescribir(salida);
readln(n);
para i: =1900 a 1899 n hacer
para j: =1 a 12 hacer
comenzar
año:=i
m:=j
si (m=1)o(m=2; ) entonces
comienzo
diciembre(año)
m:=m 12
fin
c:=año div 100;
y:=año mod 100;
w:=(y y div 4 c div 4 -2*c 26*(m 1) div 10 13 -1) mod 7;
w:=(w 7) mod 7;
inc(a[w]);
end;
writeln(a[6],' ',a[0],' ',a[1],' ',a[2],' ',a[3],' ',a[ 4], ' ', a[5]);
Cerrar(entrada); cerrar(salida);
detener; >