zoukankan      html  css  js  c++  java
  • 日历的问题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
    ", 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,一个问题,多种语言。的优点和缺点。同时多国语言是一个很好的经验。



  • 相关阅读:
    快速排序
    visio中相关设置菜单视图
    Visio中ShapeAdded和SelectionAdded
    VB托盘图标不响应WM_MOUSEMOVE的原因及解决方法
    visio应用程序相关设置选项视图
    直接插入排序的三种实现
    计算机存储的大小端模式解析
    直接选择排序及交换二个数据的正确实现
    用Apache Velocity模板引擎速造网站
    同一份代码打成多种包(JAR/WAR/EAR)时,如果不用classifier会产生什么有趣效果?
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5036577.html
Copyright © 2011-2022 走看看