YTU OJ 1403: 1.1.3 Friday the Thirteenth 黑色星期五

本文介绍了一个程序设计问题,即计算从1900年至指定年份结束期间,每月13号落在一周各天的次数。通过分析闰年和平年的规则,利用Java实现了一个算法,用于解决这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1403: 1.1.3 Friday the Thirteenth 黑色星期五

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 75  Solved: 40
[Submit][Status][Web Board]

Description

13号又是一个星期5。13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。给出N年的一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400. 这里有一些你要知道的: 1900年1月1日是星期一.4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天.年份可以被 4整除的为闰年(1992=4*498 所以 1992年是闰年,但是1990年不是闰年)以上规则不适合于世纪年.可以被400整除的世纪年为闰年,否则为平年.所以,1700,1800,1900 和2100年是平年,而2000年是闰年.请不要预先算好数据(就是叫不准打表 0。0)!

Input

一个正整数n.

Output

七个在一行且相分开的整数,它们代表13日是星期六,星期日,星期一...星期五的次数.

Sample Input

20

Sample Output

36 33 34 33 35 35 34

解析:1990年1月1日为周一,13日为周六(13%7=6)

经过一月后(31天)2月13日为6+31%7=9,数字超过了7因此要减去7 9-7=2,因此1990年2月13日为周二,

经过二月后(28天)3月13日为2+28%7=2,数字未超过7,因此1990年3月13日为周二,

经过三月后(30天)4月13日为2+30%7=5,数字未超过7,因此1990年4月13日为周五,

...

由上可知,只要知道每个月有多少天用它除以7取余数再判断一下是否超过了7,就可以知道当前13号为周几,将其存储到一个数组中记录即可。

AC代码:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int a[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//存储每个月份天数
		int b[] = new int[8];//存储每个星期中对应星期出现的数目
		int sum = 13;//要求的为13号且1990年1月1日为周一,13不做改变。
		int m = 0;//存储星期数
		for (int i = 1900; i < 1900 + n; i++) {
			for (int j = 0; j < 12; j++) {
				if (((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) && (j == 2))
					sum++;//闰年2月份多一天
				/**经过sum天后当前的星期数*/
				if (sum % 7 == 0)
					b[m]++;
				else if (sum % 7 == 1) {
					if (m + 1 > 7)
						m = m + 1 - 7;
					else
						m = m + 1;
					b[m]++;
				} else if (sum % 7 == 2) {
					if (m + 2 > 7)
						m = m + 2 - 7;
					else
						m = m + 2;
					b[m]++;
				} else if (sum % 7 == 3) {
					if (m + 3 > 7)
						m = m + 3 - 7;
					else
						m = m + 3;
					b[m]++;
				} else if (sum % 7 == 4) {
					if (m + 4 > 7)
						m = m + 4 - 7;
					else
						m = m + 4;
					b[m]++;
				} else if (sum % 7 == 5) {
					if (m + 5 > 7)
						m = m + 5 - 7;
					else
						m = m + 5;
					b[m]++;
				} else if (sum % 7 == 6) {
					if (m + 6 > 7)
						m = m + 6 - 7;
					else
						m = m + 6;
					b[m]++;
				}
				sum = a[j + 1];//一次循环结束后sum变为当前月份天数
			}
		}
		for (int i = 6; i <= 7; i++)//输出周六周日天数
			System.out.print(b[i] + " ");
		for (int i = 1; i < 5; i++)
			System.out.print(b[i] + " ");//输出周一至周四天数
		System.out.print(b[5]);//输出周五天数
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值