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

根据以下信息来计算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;
}

效果例如以下:

下来是最简单的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>

效果例如以下

再看很严谨的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
end
end
display(['There are ' num2str(sum) ...
' Sundays are the 1st day of month between ' num2str(startYear)...
'-1-1 to ' num2str(endYear) '-1-1']);

效果为:

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

日历的问题C语言,C++(boost),python,Javascript,Java和Matlab实现的更多相关文章

  1. Python和Java的语法对比,语法简洁上python的确完美胜出

    Python是一种广泛使用的解释型.高级编程.通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年.可以视之为一种改良(加入一些其他编程语言的优点,如面向对象)的LISP.Python的设计哲 ...

  2. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  3. 使用boost.python封装C++库

    使用boost.python封装C++库 C++以高性能著称,但是编写较为复杂.而简洁是Python的强项.如果能珠联璧合,就能发挥两家之长.本文尝试用boost库的python模块封装C++ 前期准 ...

  4. boost.python入门教程 ----python 嵌入c++

    Python语言简介 Python是一种脚本语言.以开放的开发接口和独特的语法著称.尽管Python在国内引起注意只有几年的时间,但实际上Python出现于上世纪90年代(据www.python.or ...

  5. boost::python的使用

    boost::python库是pyhon和c++相互交互的框架,可以再python中调用c++的类和方法,也可以让c++调用python的类和方法   python自身提供了一个Python/C AP ...

  6. 使用Boost.Python构建混合系统(译)

    目录 Building Hybrid Systems with Boost.Python 摘要(Abstract) 介绍(Introduction) 设计目标 (Boost.Python Design ...

  7. 使用boost.python进行混合开发

    使用boost.python进行混合开发 原文请参照官网和各方参考,本文有改动! 参考链接:http://blog.csdn.net/lanbing510/article/details/121979 ...

  8. python学习笔记:安装boost python库以及使用boost.python库封装

    学习是一个累积的过程.在这个过程中,我们不仅要学习新的知识,还需要将以前学到的知识进行回顾总结. 前面讲述了Python使用ctypes直接调用动态库和使用Python的C语言API封装C函数, C+ ...

  9. C++ 调用 Python(通过Boost.Python)

    本文将用一个小的示例来展示如何通过Boost.Python 来实现 C++/Python 混合编程从而将两种语言的优势整合到一起. 1. CMakeLists.txt cmake_minimum_re ...

随机推荐

  1. uva 10131 Is Bigger Smarter?(DAG最长路)

    题目连接:10131 - Is Bigger Smarter? 题目大意:给出n只大象的属性, 包括重量w, 智商s, 现在要求找到一个连续的序列, 要求每只大象的重量比前一只的大, 智商却要小, 输 ...

  2. 这里的*号实际表示就是RAC中所有实例都使用

    您的位置: ITPUB个人空间 » cc59的个人空间 » 日志 发布新日志 我的日志我的足迹我的收藏 unix/linuxHA随笔backup&restoreperformance tuni ...

  3. uva 10602 Editor Nottoobad(排序)

    题目连接:10602 Editor Nottoobad 题目大意:要输入n个单词,现在有三种操作, 1.输入一个字符,需要按下一次按键.  2.通过声控删除一个字符.3.通过声控复制一遍上面的单词.现 ...

  4. Swift - 操作SQLite数据库(引用SQLite3库)

    SQLite轻量级数据库在移动应用中使用非常普遍,但是目前的库是C编写的,为了方便使用,对SQLite相关的操作用Swift进行了封装.这个封装代码使用了一个开源项目SQLiteDB,地址是:http ...

  5. c# listview导出excel文件

    首先在工程中需要添加对Microsoft Excel office 11.0 object的引用 生成excel的类代码如下 using System; using System.Collection ...

  6. 用Python对体积较大的CSV文件进行比较的经验

    用Python对体积较大的CSV文件进行比较的经验 » 进化的测试 | 进化的测试 用Python对体积较大的CSV文件进行比较的经验  python  Add comments 八 032010   ...

  7. JavaFX 简单3D演示样例

    从Java8開始,在JavaFX中便添加了3D部分的内容,包含Camera,Material,Light,Shape3D等基础内容. 当然,JavaFX 3D应该是OpenJFX里眼下正在补充和完好的 ...

  8. 【VBA研究】查找目录以下全部文件的名称

    作者:iamlaosong 目录里面保存有面单扫描的图像文件,文件名称为邮件号码.如今想收集这些邮件号码,由于量非常大,不可能一个一个的截取,仅仅能通过程序实现.假定,当前工作表B列里放的是存放这些图 ...

  9. Java并发专题 带返回结果的批量任务运行 CompletionService ExecutorService.invokeAll

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27250059 普通情况下,我们使用Runnable作为主要的任务表示形式,可是R ...

  10. 蓝桥杯 【dp?】.cpp

    题意: 给出一个2*n的方格,当刷完某一个方格的漆后可以且只可以走到相邻的任何一格,即上 下 左 右 左上 左下 右上 右下.可以从任意一个格子开始刷墙,问有多少种刷法,因为随着n的增大方案数会变多, ...