日历的问题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;
}
效果例如以下:
下来是最简单的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实现的更多相关文章
- Python和Java的语法对比,语法简洁上python的确完美胜出
Python是一种广泛使用的解释型.高级编程.通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年.可以视之为一种改良(加入一些其他编程语言的优点,如面向对象)的LISP.Python的设计哲 ...
- Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用
目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...
- 使用boost.python封装C++库
使用boost.python封装C++库 C++以高性能著称,但是编写较为复杂.而简洁是Python的强项.如果能珠联璧合,就能发挥两家之长.本文尝试用boost库的python模块封装C++ 前期准 ...
- boost.python入门教程 ----python 嵌入c++
Python语言简介 Python是一种脚本语言.以开放的开发接口和独特的语法著称.尽管Python在国内引起注意只有几年的时间,但实际上Python出现于上世纪90年代(据www.python.or ...
- boost::python的使用
boost::python库是pyhon和c++相互交互的框架,可以再python中调用c++的类和方法,也可以让c++调用python的类和方法 python自身提供了一个Python/C AP ...
- 使用Boost.Python构建混合系统(译)
目录 Building Hybrid Systems with Boost.Python 摘要(Abstract) 介绍(Introduction) 设计目标 (Boost.Python Design ...
- 使用boost.python进行混合开发
使用boost.python进行混合开发 原文请参照官网和各方参考,本文有改动! 参考链接:http://blog.csdn.net/lanbing510/article/details/121979 ...
- python学习笔记:安装boost python库以及使用boost.python库封装
学习是一个累积的过程.在这个过程中,我们不仅要学习新的知识,还需要将以前学到的知识进行回顾总结. 前面讲述了Python使用ctypes直接调用动态库和使用Python的C语言API封装C函数, C+ ...
- C++ 调用 Python(通过Boost.Python)
本文将用一个小的示例来展示如何通过Boost.Python 来实现 C++/Python 混合编程从而将两种语言的优势整合到一起. 1. CMakeLists.txt cmake_minimum_re ...
随机推荐
- SINGLETON(单例模式)---(孤独的人)
很多时候,我们都很彷徨,因为,在身边的朋友,很少. package patterns.createable.singleton; /** * 孤独的人啊 * 我为你写了一个类 * 这个类,在我们的程序 ...
- ThinkPhp学习08
原文:ThinkPhp学习08 一.普通查询方式 a.字符串 $arr=$m->where("sex=0 and username='gege'")->find(); ...
- POJ 3189 Steady Cow Assignment【网络流】
题意:每个奶牛对所有的牛棚有个排名(根据喜欢程度排的),每个牛棚能够入住的牛的数量有个上限,重新给牛分配牛棚,使牛棚在牛心中的排名差(所有牛中最大排名和最小排名之差)最小. 牛棚个数最多为20,那么直 ...
- android doGet和doPost
doGet和doPost的差别 get和post是http协议的两种方法,另外还有head, delete等 这两种方法有本质的差别,get仅仅有一个流,參数附加在url后.大小个数有严格限制且仅仅 ...
- IE与FF脚本兼容性问题
(1) window.event: 表示当前的事件对象,IE有这个对象,FF没有,FF通过给事件处理函数传递事件对象 (2) 获取事件源 IE用srcElement获取事件源,而FF用target获取 ...
- Mono和Jexus并且部署ASP.NET MVC3、4、5和WebApi
Linux(CentOS 6.7)下配置Mono和Jexus并且部署ASP.NET MVC3.4.5和WebApi(跨平台) 1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和 ...
- Fluentd: Open Source Log Management
Fluentd: Open Source Log Management "Fluentd" is an open-source tool to collect events and ...
- EA强大功能之代码凝视
前面讲了EA怎样方便我们生成代码,这次讲一下,怎样生成具体的凝视. 1.文件表头凝视 (1)点击工具----选项 在常规项里改动作者: 在代码project中改动代码project的默认语言. (2) ...
- 基于HTTP和TFTP的PXE批量自动化安装Linux系统
CentOS 6.5 PXE自动化部署系统 拓扑图如下: 步骤: 1. 安装http服务,上传ISO文件 [root@UCS-1 ~]# yum install httpd –y [root@UCS ...
- 【VBA研究】查找目录以下全部文件的名称
作者:iamlaosong 目录里面保存有面单扫描的图像文件,文件名称为邮件号码.如今想收集这些邮件号码,由于量非常大,不可能一个一个的截取,仅仅能通过程序实现.假定,当前工作表B列里放的是存放这些图 ...