Volvemos a implementar en C. Divertido problema. Mi aproximación ha sido la siguiente: si el 1/1/1900 es lunes, el 7/1/1900 es domingo. Si somos capaces de calcular el número de días que hay desde cualquier fecha al 1/1/1900, el resto de la división por 7 de este número nos dará el día de la semana (siendo 1 el lunes y 0 el domingo). El resto consiste en iterar por las fechas que nos piden.
#include <stdio.h> #include <stdlib.h> #define SUNDAY 0 int is_leap_year(int year) { return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)); } int days_in_month(int month, int year) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 2: return is_leap_year(year) ? 29 : 28; default: return 30; } } int days_to_init(int day, int month, int year) { int days = 0; int month0 = 1; int year0 = 1900; days += day; while (month > month0) { days += days_in_month(month - 1, year); month--; } while (year > year0) { days += is_leap_year(year - 1) ? 366 : 365; year--; } return days; } /* 1 => Monday .... 7 => Sunday */ int day_of_week(int day) { return day % 7; } int main(int argc, char *argv[]) { int n_sundays = 0; int days; for (int year_start = 1901; year_start <= 2000; year_start++) { for (int month_start = 1; month_start <= 12; month_start++) { days = days_to_init(1, month_start, year_start); if (day_of_week(days) == SUNDAY) { printf("%d/%d/%d es domingo\n", 1, month_start, year_start); n_sundays++; } } } printf("%d domingos caen en primero de mes.\n", n_sundays); return 0; }
https://projecteuler.net/problem=20 => Factorial digit sum
Este problema también es sencillo, solo hay que recorrer las cifras y sumarlas.
En Python:
def fact(n): if n <= 1: return 1 else: return n * fact(n -1) s = 0 for a in str(fact(100)): s += int(a) print s
En C es latoso por la limitación de los tipos núméricos, ningún tipo entero (ni siquiera un unsigned long) es suficiente para contener este número tan grande.
No hay comentarios:
Publicar un comentario