- 01/01/1900 foi uma segunda-feira
- 30 dias tem setembro, abril, junho e novembro
- todos os outros meses tem 31 exceto fevereiro que pode ter 28 ou 29 (quando for bissexto)
- o ano bissexto ocorre em todos os anos divisíveis por 4 exceto na virada do século, a menos que esse ano seja divisível por 400
Se fosse para usar as bibliotecas de data de qualquer linguagem esse problema seria muito simples, mas o objetivo é fazer com que o programador crie uma lógica apenas com as informações passadas.
You are given the following information, but you may prefer to do some research for yourself.Link para a pergunta: https://projecteuler.net/problem=19
- 1 Jan 1900 was a Monday.
- Thirty days has September,
- April, June and November.
- All the rest have thirty-one,
- Saving February alone,
- Which has twenty-eight, rain or shine.
- And on leap years, twenty-nine.
How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?
- A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.
Criei o seguinte script para resolver o problema;
Primeiramente criei uma função que retorna True se o ano for bissexto e False se não for.
Depois eu criei a função que calcula o próximo dia da semana (se o dia for 7 o próximo tem que ser 1, pois a semana começa novamente). Eu considerei que segunda-feira foi o dia 1, pois no enunciado do problema fala que 01/01/1900 foi uma segunda-feira e é a partir dessa data que o programa inicia.
Depois disse fiz vários "for's" que passam pelos anos, meses e dias do período especificado.
O script começa a contar a partir de 01/01/1900, mas só pode considerar na soma de domingos no início do mês a partir de 01/01/1901.
Algumas outras soluções que encontrei no fórum:
Usuário: emandres
import datetime count = 0 for y in range(1901,2001): for m in range(1,13): if datetime.datetime(y,m,1).weekday() == 6: count += 1 print count
Usuário: nmadnani
numdays ={1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31} startday = 2 count = 0 for m in range(1,13): currday = startday for curryear in xrange(1901,2001): leap = False prevyear = curryear-1 if prevyear % 100 == 0 and prevyear % 400 == 0: leap = True elif prevyear % 4 == 0: leap = True if leap: currday = (currday + 2) % 7 else: currday = (currday + 1) % 7 if currday == 0: count += 1 tmp = numdays[m] + 1 startday = (startday + (tmp - ((tmp/7)*7)) - 1) % 7 print count
Nenhum comentário:
Postar um comentário