8

[Golang] Counting Sundays - Problem 19 - Project Euler

 2 years ago
source link: http://siongui.github.io/2018/10/22/go-counting-sundays-problem-19-project-euler/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

[Golang] Counting Sundays - Problem 19 - Project Euler

October 22, 2018

Problem: [1]

You are given the following information, but you may prefer to do some research for yourself.

  • 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.
  • A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.

How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?

Solution:

171

Run Code on Go Playground

package main

import (
      "fmt"
)

func monthDays(year, month int) int {
      switch month {
      case 1, 3, 5, 7, 8, 10, 12:
              return 31
      case 4, 6, 9, 11:
              return 30
      case 2:
              if year%400 == 0 {
                      return 29
              }
              if year%100 == 0 {
                      return 28
              }
              if year%4 == 0 {
                      return 29
              }
              return 28
      }
      panic("not correct month")
}

func main() {
      year := 1900
      month := 1
      day := 1
      weekDay := 1 // 1: Monday ... 7: Sunday

      count := 0
      for {
              day += 1
              if day > monthDays(year, month) {
                      day = 1
                      month += 1
              }
              if month > 12 {
                      month = 1
                      year += 1
              }

              weekDay += 1
              if weekDay > 7 {
                      weekDay = 1
              }

              // first day of the month is Sunday
              if day == 1 && weekDay == 7 && year > 1900 {
                      //fmt.Printf("%d %d 1st is Sunday\n", year, month)
                      count += 1
              }

              // termination condition
              if year == 2000 && month == 12 && day == 31 {
                      break
              }
      }

      fmt.Printf("total %d Sunday", count)
}

Test on:

References:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK