一个日历问题的C语言,python和Javascript的实现

今天看到一个很有趣的题目,题目描述如下:

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

下来是最简单的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实现了一下,感觉不错,有可视化和跨平台性:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>问题2的解答:Javascript版本</title>
</head>
<body>
<script type="text/javascript">
	yearTest = /^[1-9]\d{3}$/;
	days = new Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	leapdays = new Array(0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	for (var i = 1; i < days.length; i++)
		days[i] += days[i - 1];
	for (var i = 1; i < leapdays.length; i++)
		leapdays[i] += leapdays[i - 1];

	sum = 0;

	function isLeap(year)
	{
		if (!yearTest.test(year))
			return false;
		if (year % 4 == 0 && year % 100 != 0)
			return true;
		if (year % 400 == 0)
			return true;
		return false;
	}

	startWeek = 1;
	totalDays = 365;

	function getResultOfYear(year)
	{
		var sum = 0;
		if (isLeap(year))
		{
			totalDays = 366;
			for (var i = 0; i < leapdays.length - 1; i++)
			{
				if ((leapdays[i] % 7 + startWeek) % 7 == 0)
				{
					//alert("year: " + year + " month: " + (i + 1));
					sum++;
				}
			}
			startWeek = (totalDays % 7 + startWeek) % 7;
		}
		else
		{
			totalDays = 365;
			for (var i = 0; i < days.length - 1; i++)
			{
				if ((days[i] % 7 + startWeek) % 7 == 0)
					sum++;
			}
			startWeek = (totalDays % 7 + startWeek) % 7;
		}
		return sum;
	}
	function main()
	{
		var startYear=document.getElementById("startText").value.replace(/(^\s+)|(\s+$)/g,'');
		if (startYear == "" || !yearTest.test(startYear))
		{
			alert("不合法的起始年份!");
			return;
		}
		if (startYear < 1900)
		{
			alert("起始年份必须大于等于1900!");
			return;
		}
		var endYear = document.getElementById("endText").value.replace(/(^\s+)|(\s+$)/g,'');
		if (endYear == "" || !yearTest.test(endYear))
		{
			alert("不合法的终止年份!");
			return;
		}
		if (endYear < startYear)
		{
			alert("终止年份必须大于等于起始年份!");
			return;
		}
		sum = 0;
		startWeek = 1;

		for (i = 1900; i < startYear; i++)
			getResultOfYear(i);
		for (i = startYear; i <= endYear; i++)
			sum += getResultOfYear(i);
		document.getElementById("resultText").innerHTML = "从"
				+ startYear + "年1月1日到" + endYear +
				"年12月23日有<b>" + sum + "</b>个月的1日是周日。";
	}
</script>
	请输入起始年份:
	<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>
	<br/>
	<p id="resultText"></p>
</body>
</html>

JavaScript在手机上的效果如下:

OK,一个问题,多种语言,各有优劣。同时用多种语言是一种很不错的体验。

时间: 2024-10-01 23:04:38

一个日历问题的C语言,python和Javascript的实现的相关文章

JavaScript做的一个日历

小米手机上的日历看着不错,就用javascript试着做了一下,如图: 核心内容就是三个部分,公历部分--->script.js,农历部分--->lunar.js,天气部分--->weather.js,尽管日历上加个天气好像看起来不那么恰当,但本来就是练习,就顺便写了. script.js主要在表格上填写日期信息以及绑定一些事件处理程序,基本上就是一个calendar对象,具体过程就是先得到当天的星期和本月的天数,这样当月的公历日期信息就完整了,而上月和下月的公历信息也跟着出来了. lu

为什么说Python是一门动态语言--Python的魅力

动态语言的定义:动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.动态语言目前非常具有活力.众所周知的ECMAScript(JavaScript)便是一个动态语言,除此之外如PHP.Ruby.Python等也都属于动态语言,而C.C++等语言则不属于动态语言.----来自维基百科 你是不是有过给class里面变量赋值却发现程序没达到自己预期结果的遭遇?是不

如何编写一个带命令行参数的Python文件

看到别人执行一个支持命令行参数的python文件,瞬间觉得高大上起来.牛逼起来,那么如何编写一个带命令行参数的python脚本呢?不用紧张,下面将简单易懂地让你学会如何让自己的python脚本,支持命令行参数. 首先你要知道python中的sys模块的一些功能: import sys print "the number of python program's argument:",len(sys.argv) print "the value of every argument

一个轻客户端,多语言支持,去中心化,自动负载,可扩展的实时数据写服务的实现方案讨论

背景 背景是设计一个实时数据接入的模块,负责接收客户端的实时数据写入(如日志流,点击流),数据支持直接下沉到HBase上(后续提供HBase上的查询),或先持久化到Kafka里,方便后续进行一些计算和处理,再下沉到文件系统或做别的输出. 在设计中,对于客户端和服务端有这么些目标. 客户端需要支持多语言(Java,C++),做得尽量轻量级,只要连上服务端的ip:port,以RPC的形式调用简单的write就可以把数据写出去.客户端不承担任何逻辑的处理,服务端的负载均衡对客户端是透明的. 服务端想要

Go将统治下一个10年?Go语言发展现状分析

"本文是国内Go语言大中华区首席布道师--许式伟,在QCon2015上海站上的分享.他预测Go语言10年内一定会超过C和java,并且统治这一个10年. Go语言语法及标准库变化 Go从1.0版本到现在(2015年)已经有三年多的时间,大的版本发布了五个,下面大家一起看看每个大版本分别都改了什么,当然这里不可能把所有的细节都提到,但我认为重要的会提出来. 首先是Go1.1,Go1.0于2012年4月发布,此后基本维持了每半年发布一个新版本的时间间隔.Go1.5比较例外,在Go1.5的拖累下,Go

分享一个查IP归属地的python脚本

今天同事给了6W多个IP叫我查出ISP和归属地,果断用python urllib2搞之,数据库用是淘宝的API接口 #!/usr/bin/python #coding:utf-8 import urllib2 import json import time url = 'http://ip.taobao.com/service/getIpInfo.php?ip=' def checkTaobaoIP(ip):     try:         response = urllib2.urlopen

自定义的一个日历Calender

产品要做签到功能,签到功能要基于一个日历来进行,所以就根据 要求自定义了一个日历 自定义控件相信做android都知道: (1)首先创建一个类,继承一个容器类或者是一个控件 (2)然后就是你需要设置的属性等的,在attrs文件夹中 (3)然后就是在类里边进行属性的设置以及布局等等功能的添加 其实自定义一个日历问题都不多,很多人都会想到通过一个gridView然后填充就可以,确实是这样,主要是在显示每个月的第一天的位置以及每个月显示多少天有点绕. 思路:通过判断当前星期几然后进行日历的填充,但是填

一个页面根据访问者的语言或国家来呈现不同的翻译版本

JSP 国际化 在开始前,需要解释几个重要的概念: 国际化(i18n):表明一个页面根据访问者的语言或国家来呈现不同的翻译版本. 本地化(l10n):向网站添加资源,以使它适应不同的地区和文化.比如网站的印度语版本. 区域:这是一个特定的区域或文化,通常认为是一个语言标志和国家标志通过下划线连接起来.比如"en_US"代表美国英语地区. 如果想要建立一个全球化的网站,就需要关心一系列项目.本章将会详细告诉您如何处理国际化问题,并给出了一些例子来加深理解. JSP容器能够根据reques

Python 与 Javascript 之比较

最近由于工作的需要开始开发一些Python的东西,由于之前一直在使用Javascript,所以会不自觉的使用一些Javascript的概念,语法什么的,经常掉到坑里.我觉得对于从Javascript转到Python,有必要总结一下它们之间的差异. 基本概念 Python和Javascript都是脚本语言,所以它们有很多共同的特性,都需要解释器来运行,都是动态类型,都支持自动内存管理,都可以调用eval()来执行脚本等等脚本语言所共有的特性. 然而它们也有很大的区别,Javascript这设计之初