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

时间:2023-03-09 03:47:48
日历的问题C语言,C++(boost),python,Javascript,Java和Matlab实现

今天看到一个很有意思的话题,例的标题叙述性描述,下面:

根据以下信息来计算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 year
int getYearNum(int* start, int year); // Num of days of each month
int 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;
}

效果例如以下:

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

下来是最简单的python:

import calendar
sum = 0
startYear = 1901
endYear = 2000
for year in xrange(startYear, endYear + 1):
for month in xrange(1, 13):
if calendar.monthcalendar(year, month)[0].index(1) == 6:
sum = sum + 1 print 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>

效果例如以下

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

再看很严谨的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()));
}
}

执行效果例如以下:

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

最后的最后,来一个鬼畜版: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
end
end
display(['There are ' num2str(sum) ...
' Sundays are the 1st day of month between ' num2str(startYear)...
'-1-1 to ' num2str(endYear) '-1-1']);

效果为:

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

OK,一个问题,多种语言。的优点和缺点。同时多国语言是一个很好的经验。