8
[Golang] Counting Sundays - Problem 19 - Project Euler
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.
[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
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:
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK