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

根据以下信息来计算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. 5350.support

    3G6200N3G6200NL3G300MAIR3GIIALL02393GALL0256NALL5002ALL5003ARGUS_ATP52B,ASL26555AWM002EVBAWAPN2403BC ...

  2. Database Connection Pool Library | Libzdb

    Database Connection Pool Library | Libzdb A small, easy to use Open Source Database Connection Pool ...

  3. ExtJs4 笔记(3) Ext.Ajax 对ajax的支持

    本篇主要介绍一下ExtJs常用的几个对JS语法的扩展支持,包括Ajax封装,函数事件操作封装,还有扩展的常用函数等.Ajax服务端交互式操作是提交到.NET MVC.后续服务端交互都采用这一方式实现. ...

  4. Delphi引用C对象文件

    C语言应用非常广泛,并在世界各地拥有大量的代码库.这些代码库与Delphi的可比性较小,因此如果我们无需转换为Delphi代码而可以直接使用这些库的部分代码就完美了.幸运的是,Delphi允许连接到C ...

  5. 与众不同 windows phone (21) - Device(设备)之摄像头(拍摄照片, 录制视频)

    原文:与众不同 windows phone (21) - Device(设备)之摄像头(拍摄照片, 录制视频) [索引页][源码下载] 与众不同 windows phone (21) - Device ...

  6. 14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器

    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器 当InnoDB 被开发, 内分配齐 提供了与操作系统和运行库往往缺乏 ...

  7. Codeforces 475D CGCDSSQ 求序列中连续数字的GCD=K的对数

    题目链接:点击打开链接 #include <cstdio> #include <cstring> #include <algorithm> #include < ...

  8. 【Access2007】将Excel表导入到Access2007在现有的表成

    将Excel表导入到Access2007,你会发现邪恶Access2007这将帮助你自己主动创建表.您是否想插入完全没问你到一个现有的表. 然后,我们需要解决这个问题: 一.常的步骤先将Excel表导 ...

  9. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  10. JavaFX2: 鼠标拖动选择和Ctrl+Shift连续区间选择的ListView

    JavaFX2的ListView中的多选没有提供鼠标拖动选择的功能,同时按下Ctrl和Shift后连续的区间选中也不支持,以下代码用于处理这两个问题,细节见代码注释: import com.sun.j ...