一个日历问题的C语言,C++(boost),python,Javascript,Java和Matlab的实现

来源:互联网 发布:淘宝论文修改多少钱 编辑:程序博客网 时间:2024/05/22 12:56

今天看到一个很有趣的题目,题目描述如下:

根据下列信息计算在1901年1月1日至2000年12月31日间共有多少个星期天落在每月的第一天上?
a)  1900.1.1是星期一
b)  1月,3月,5月,7月,8月,10月和12月是31天
c)  4月,6月,9月和11月是30天
d)  2月是28天,在闰年是29天
e)  公元年数能被4整除且又不能被100整除是闰年
f)  能直接被400整除也是闰年


以下是C语言实现版本:

#include <stdio.h>#include <stdbool.h>bool isLeapYear(int year);// start is the weekday of 1st, January// return the num of the first day of each month// is Sunday.// the start will change into the next yearint getYearNum(int* start, int year);// Num of days of each monthint days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int leapdays[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int main(void){int sum = 0;int start = 1901;int end = 2000;int startWeek = 1;int startYear = 1900;int i;for (i = 1; i < 13; ++i)days[i] += days[i - 1];for (i = 1; i < 13; ++i)leapdays[i] += leapdays[i - 1];for (i = startYear; i < start; ++i)getYearNum(&startWeek, i);for (i = start; i <= end; ++i)sum += getYearNum(&startWeek, i);printf("%d\n", sum);return 0;}bool isLeapYear(int year){if (year % 4 == 0 && year % 100 != 0)return true;else if (year % 400 == 0)return true;return false;}int getYearNum(int* start, int year){int i;int count = 0;int yeardays;if (isLeapYear(year)){yeardays = 366;for (i = 0; i < 12; ++i)if ((leapdays[i] % 7 + *start)%7 == 0)++count;} else{yeardays = 365;for (i = 0; i < 12; ++i)if ((days[i] % 7 + *start)%7 == 0)++count;}*start = (yeardays % 7 + *start)%7;return count;}


下面是强大的C++和boost程序库的舞台:

#include <boost/date_time/gregorian/gregorian.hpp>#include <iostream>using namespace std;using namespace boost::gregorian;int main(){int startYear, endYear;cout << "Please input the start year: ";cin >> startYear;cout << "Please input the end year: ";cin >> endYear;date stdt(startYear, 1, 1);date eddt(endYear + 1, 1, 1);month_iterator m_iter(stdt);int sum = 0;while (m_iter != eddt){if (m_iter->day_of_week() == 0){cout << *m_iter << " is Sunday" << endl;++sum;}++m_iter;}cout << "There are " << sum << " Sundays are the 1st day of month between " << stdt << " and " << eddt - date_duration(1) << endl;return 0;}

效果如下:


下来是最简单的python:

import calendarsum = 0startYear = 1901endYear = 2000for year in xrange(startYear, endYear + 1):for month in xrange(1, 13):if calendar.monthcalendar(year, month)[0].index(1) == 6:sum = sum + 1print sum

最近对于JavaScript的网页脚本有点感兴趣,就试着用JavaScript实现了一下,感觉不错,有可视化和跨平台性:

function main(){var myDate = new Date();var startYear = document.getElementById("startText").value;var endYear = document.getElementById("endText").value;var sum = 0;var result = document.getElementById("resultText");result.innerHTML = "";myDate.setDate(1);for (var year = startYear; year <= endYear; year++){myDate.setFullYear(year);for (var month = 0; month < 12; month++){myDate.setMonth(month);if (myDate.getDay() == 0){/*var newDate = document.createElement("p");newDate.innerHTML = myDate.toString();result.appendChild(newDate);*/result.innerHTML += myDate.toDateString() + "<br/>";sum++;}}}myDate.setFullYear(startYear);myDate.setMonth(0);myDate.setDate(1);result.innerHTML += "<br/>There are " + sum + " Sundays are the 1st day of month between " + myDate.toDateString();myDate.setFullYear(endYear);myDate.setMonth(11);myDate.setDate(31);result.innerHTML += " and " + myDate.toDateString();}

对应的HTML
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Question 2</title><script src="test.js" type="text/javascript"></script></head><body>请输入起始年份:<input type="text" id="startText" autofocus onkeydown="if(event.keyCode==13){endText.focus();}"/><br/>请输入终止年份:<input type="text" id="endText" onkeydown="if(event.keyCode==13){ok.click();}"/><br/><button id="ok" onclick="main()"> 确定 </button><div id="resultText"></body></html>

效果如下

再看非常严谨的Java程序:

import java.util.Calendar;import java.util.Scanner;import java.text.SimpleDateFormat;public class Question2{static public void main(String[] args){int startYear, endYear;Scanner sc = new Scanner(System.in);System.out.print("Please input start year: ");startYear = sc.nextInt();System.out.print("Please input end year: ");endYear = sc.nextInt();int sum = 0;Calendar dt = Calendar.getInstance();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");for (int year = startYear; year <= endYear; ++year){dt.set(Calendar.YEAR, year);for (int month = 1; month < 13; ++month){dt.set(Calendar.MONTH, month);dt.set(Calendar.DAY_OF_MONTH, 1);if (dt.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){System.out.println(sdf.format(dt.getTime()) + " is Sunday.");++sum;}}}dt.set(startYear, Calendar.JANUARY, 1);System.out.print("There are " + sum + " Sundays are the 1st day of month between " + sdf.format(dt.getTime()));dt.set(endYear, Calendar.DECEMBER, 31);System.out.println(" to " + sdf.format(dt.getTime()));}}

运行效果如下:


最后的最后,来一个鬼畜版:Matlab版本:

startYear = input('Please input the start year: ');endYear = input('Please input the end year: ');sum = 0;for year = startYear : endYear    for month = 1 : 12        cal = calendar(year, month);        if cal(1,1) == 1            sum = sum + 1;            display([num2str(year) '-' num2str(month) '-1 is Sunday']);        end    endenddisplay(['There are ' num2str(sum) ...    ' Sundays are the 1st day of month between ' num2str(startYear)...    '-1-1 to ' num2str(endYear) '-1-1']);

效果为:




OK,一个问题,多种语言,各有优劣。同时用多种语言是一种很不错的体验。



1 0
原创粉丝点击