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

根据以下信息来计算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. 图解UML类与类之间的六中关系

    大话设计模式上的一个图,我用EA画出来的:  UML中的6大关系相关英文及音标:  依赖关系 dependency [di'pendənsi]  关联关系 association  [ə,səuʃi' ...

  2. Qt4在linux下的安装

    1.下载SDK ftp://ftp.informatik.hu-berlin.de/pub/Mirrors/ftp.troll.no/QT/qtsdk/qt-sdk-linux-x86-opensou ...

  3. BZOJ 1212 HNOI 2004 L语言 Trie树

    标题效果:给一些词.和几个句子,当且仅当句子可以切子可以翻译词典,这意味着该子将被翻译. 找到最长前缀长度可以被翻译. 思维:使用Trie树阵刷.你可以刷到最长的地方是最长的字符串可以翻译到的地方. ...

  4. 用Ajax删除的做法

    一般程序文件代码 using System;using System.Web;using System.Linq;using System.Data.Linq; public class Shanch ...

  5. 如何配置Git支持大小写敏感和修改文件名中大小写字母呢?(转)

    1. 在新建代码文件时,不注意把文件名应该小小写搞错了2. 文件已经push到远程了3. 在windows下面将文件名字改为全小写 改好后,在Git中没有任何反应,使用git status时,如果遇到 ...

  6. Mysql InnoDB 是IOT表 锁基于索引

    </pre>Mysql InnoDB 是IOT表 锁基于索引<pre>

  7. Java 开源博客——B3log Solo 0.6.1 正式版发布了!

    Java 开源博客 —— B3LOG Solo 0.6.1 正式版发布了!欢迎大家下载. 该版本主要是改善细节体验,并加入了一款 Metro 风格的皮肤. 特性 基于标签的文章分类 Ping Goog ...

  8. GitHub 优秀Android 开源项目

    阅读目录 1.Xabber客户端 2.oschina客户端 3.手机安全管家 4.星座连萌 5.玲闹铃 6.魔乐盒 7.PWP日历 8.Apollo音乐播放器 9.夏普名片识别 10.高仿人人网 11 ...

  9. [Backbone]Make Backbone Better With Extensions

    Backbone is becoming wildly popular as a web application development framework. Along with this popu ...

  10. 下载jdk文件后缀是.gz而不是.tar.gz怎么办

    用chrom浏览器下载了linux版的jdk,发现文件后缀是.gz,没看过这玩意,一打开,还是一个.gz文件,原本以为是新文件后缀呢.那个百度google啊. . ..最后都没发现有这方面的资料啊.. ...