蓝桥杯——黑色星期五

在西方,星期五和数字 13 都代表着坏运气,两个不幸的个体最后结合成超级不幸

的一天。所以,不管哪个月的十三日又恰逢星期五就叫“黑色星期五”。

要求:输入年份,输出是:判断该年是否包含黑色星期五,如包含,给出具体日期

思路:
基姆拉尔森计算公式:
W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7
此公式要区分开1、2月,1、2月的日期用此公式计算时,年份-1,月份+12,再代入公式计算
编程实现

#include<stdio.h>
int main()
{
       int n,m,year,x;
       int month;
       printf("请输入所要计算的年份:");   
     scanf("%d",&n);
    printf("%d年包含的黑色星期五有:\n",n);
       year=n;
       for(month=1;month<=12;month++)
       {
              m=month;
              if(m==1||m==2)  //如果是1、2月,倒退为前一年,月份加12 
              {
                     m+=12;
                     year--;
              x=(13+2*m+3*(m+1)/5+year+year/4-year/100+year/400+1)%7;
                     if(x==5)  //星期五 
                     {                           
                            printf("%d-%d-13\n",n,month);}
              }
              else
              {
         x=(13+2*m+3*(m+1)/5+year+year/4-year/100+year/400+1)%7;
                     if(x==5)
                     {      
                            printf("%d-%d-13\n",n,month);}                    
                     }
             year=n;
}
       return 0;
### 蓝桥杯 Java 2024 年比赛题目及解题思路 #### 比赛概述 蓝桥杯作为一项面向全国大学生的编程竞赛,其 Java B 组的比赛一直以来都注重基础知识的应用以及对实际问题解决能力的考查。根据参赛者的反馈,在2024年的比赛中,试题整体偏向基础,涉及较少复杂的算法设计,而更加强调数学思维的应用[^1]。 #### 解题策略与注意事项 在比赛过程中,合理的时间管理至关重要。建议选手完填空部分后快速浏览所有大题,优先处理简单题目以确保得分最大化。对于无法完全解答的大题,应尽早提交初步版本并逐步优化,利用 OI 赛制的优势争取更多分数[^2]。 #### 示例题目解析:黑色星期五 以下是具体的一道典型例题——“黑色星期五”的分析: ##### 题目描述 给定一个年份(≥1998),统计该年内有多少个月存在至少一次“黑色星期五”,即当月的13号恰好落在周五的情况。 ##### 解题方法 此问题本质上属于日期运算范畴,需基于已知条件推导目标结论: - 已知初始状态为 **1998年1月1日是周四**; - 判断某一年各月份中的第十三天是否为周五,则可通过累加每日增量来动态更新当前周几信息; - 特别需要注意的是闰年规则的影响 —— 即每四年增加一天至二月末位置处[^3]。 下面是实现上述逻辑的一种方式: ```java import java.util.Scanner; public class BlackFriday { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int year = scanner.nextInt(); // 输入待检测年度 boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); // 计算是否为润年 int daysInMonth[] = {31, (isLeapYear ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 各月天数数组初始化 int startDayOfWeek = getStartDayOfWeek(year); // 获取当年首日对应星期编号(周一=1,..., 周日=7) int fridayCount = countBlackFridays(daysInMonth, startDayOfWeek); // 主函数调用计数器返回最终结果 System.out.println(fridayCount); } private static int getStartDayOfWeek(int targetYear){ final int BASE_YEAR = 1998; final int START_DAY_1998_JANUARY_1ST = 4; // 星期四设为基准值4 int totalDaysPassedSinceBase = calculateTotalDaysBetween(BASE_YEAR, targetYear); return ((START_DAY_1998_JANUARY_1ST + totalDaysPassedSinceBase)%7)+1 ; } private static int calculateTotalDaysBetween(int baseYr,int tgtYr){ int sumOfYearsDifference = Math.abs(tgtYr-baseYr); int leapYearsWithinRange = (sumOfYearsDifference/4)-(sumOfYearsDifference/100)+(sumOfYearsDifference/400); return (sumOfYearsDifference*365)+leapYearsWithinRange; } private static int countBlackFridays(int[] monthLengthsArray, int initialWeekdayOffset){ int blackFrCounter=0; int cumulativeDaysSoFar=initialWeekdayOffset-1;//调整起始偏移量使得索引从零开始便于模操作 for(int i=0;i<monthLengthsArray.length;i++){ if((cumulativeDaysSoFar+13)%7==5){blackFrCounter++;}//如果累积后的第十三天正好位于第五位则满足条件 cumulativeDaysSoFar += monthLengthsArray[i]; } return blackFrCounter; } } ``` 以上代码片段展示了如何依据既定规则构建解决方案框架,并通过逐层分解任务简化复杂度。 #### 总结 通过对历年真题的研究发现,掌握扎实的基础理论知识配合灵活运用技巧能够有效提升答题效率与准确性。希望每位参与者都能从中受益匪浅!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值