news 2026/6/23 21:18:05

UVa 150 Double Time

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 150 Double Time

题目描述

儒略·恺撒于公元前45 4545年采用了一种标准历法,每年365 365365天,每四年增加一天(2 2229 2929日)。但这一历法并不完全准确,季节的开始时间在一年中逐渐偏移。1582 15821582年,教皇格里高利十三世颁布了一种新历法(格里高利历),规定世纪年只有能被400 400400整除才是闰年。同时,为了将历法与季节重新对齐,当年进行了一次调整:1582 1582158210 10104 44日(星期四)之后直接是10 101015 1515日(星期五)。天主教国家立即采用了这一新历法,而英国和美国直到1752 17521752年才改用(1752 175217529 992 22日星期三之后是9 9914 1414日星期四)。因此,有一段很长的时期,历史记录使用了两种不同的历法。

本题要求编写程序,读入一个日期,判断它是旧式(儒略历)还是新式(格里高利历),并将其转换为另一种历法的日期。

输入格式

输入由多行组成,每行包含一个星期 日期 月份 年份的格式,例如Friday 25 December 1992。日期范围在1600 160016001 111 11日至2099 2099209912 121231 3131日之间,但转换后的日期可能超出此范围。所有星期和月份的名称首字母大写,其余小写。输入以一行仅包含#的行结束。

输出格式

输出对应于输入的每一行,输出转换后的日期,格式与输入相同,但旧式日期在日期数字后紧跟一个星号(*),中间无空格。

样例输入

Saturday 29 August 1992 Saturday 16 August 1992 Wednesday 19 December 1991 Monday 1 January 1900 #

样例输出

Saturday 16* August 1992 Saturday 29 August 1992 Wednesday 1 January 1992 Monday 20* December 1899

题目分析

本题的核心在于历法转换与星期匹配。我们需要判断一个给定的日期(带有星期信息)是属于儒略历还是格里高利历,然后将其转换为另一种历法下的日期,并保持星期一致。

关键点

  1. 闰年规则不同

    • 儒略历:年份能被4 44整除即为闰年。
    • 格里高利历:年份能被400 400400整除,或能被4 44整除但不能被100 100100整除。
  2. 日期调整

    • 1582 1582158210 10104 44日(儒略历)之后直接跳到10 101015 1515日(格里高利历)。
    • 1752 175217529 992 22日(儒略历)之后直接跳到9 9914 1414日(格里高利历)。
  3. 星期匹配

    • 输入中给出了星期,我们可以利用星期信息来判断该日期原本属于哪种历法。如果日期在儒略历下计算出的星期与给定星期一致,则它是旧式日期;否则是新式日期。

解题思路

  1. 统一基准日期

    • 选择一个共同的基准日期(例如1583 158315831 111 11日),计算给定日期距离该基准的天数。
    • 分别按照儒略历和格里高利历的规则计算天数。
  2. 判断历法类型

    • 根据基准日期的星期(已知为星期一),分别计算出两种历法下给定日期对应的星期。
    • 如果与输入星期一致,则该日期属于该历法。
  3. 进行转换

    • 如果日期是儒略历,则将其转换为格里高利历;反之亦然。
    • 转换时,根据两种历法的天数差调整日期。
  4. 输出格式

    • 输出转换后的日期,如果是旧式(儒略历)则在日期后加*

算法步骤

  1. 读入一行日期,解析星期、日、月、年。
  2. 计算该日期在儒略历和格里高利历下距离基准日期的天数。
  3. 根据星期匹配判断原历法。
  4. 根据原历法,使用另一种历法的规则重新计算日期。
  5. 输出转换结果,旧式日期后加*

代码实现

// Double Time// UVa ID: 150// Verdict: Accepted// Submission Date: 2016-01-30// UVa Run Time: 0.019s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;structdate{intdayOfWeek,dayOfMonth,month,year;boolisOldFormat;};conststring months[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};conststring weekdays[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};constintdaysInMonth[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};intisLeapYear(intyear,booluseOldFormat){return(useOldFormat?year%4==0:(year%400==0||(year%4==0&&year%100!=0)))?1:0;}voidaddDays(date&startDate,intdays,booluseOldFormat){while(days>0){intleapYear=isLeapYear(startDate.year,useOldFormat);// 注意判断条件if(leapYear&&days>366){days-=366;startDate.year+=1;}elseif(!leapYear&&days>365){days-=365;startDate.year+=1;}else{for(inti=0;i<12;i++)if(days>daysInMonth[leapYear][i]){days-=daysInMonth[leapYear][i];startDate.month+=1;}elsebreak;startDate.dayOfMonth+=days;days=0;}}}intgetDays(date aDate,booluseOldFormat){intdays=useOldFormat?88:78;for(inti=1583;i<aDate.year;i++)days+=(isLeapYear(i,useOldFormat)?366:365);for(inti=0;i<aDate.month;i++)days+=daysInMonth[isLeapYear(aDate.year,useOldFormat)][i];days+=aDate.dayOfMonth;returndays;}voidconvertToOtherDate(date aDate){// 计算新旧两种日期格式两个日期之间的相隔天数,分别从旧的基准日期和// 新的基准日期计算间隔天数,统一调整为从 1583-01-01 开始计算天数。intoldDays=getDays(aDate,true);intnewDays=getDays(aDate,false);// 根据星期几是否吻合来判断日期格式并转换aDate.dayOfMonth=0;aDate.month=0;aDate.year=1583;aDate.isOldFormat=(3+oldDays)%7==aDate.dayOfWeek;if(aDate.isOldFormat){aDate.dayOfWeek=(3+oldDays)%7;oldDays-=78;addDays(aDate,oldDays,false);}else{aDate.dayOfWeek=(3+newDays)%7;newDays-=88;addDays(aDate,newDays,true);}aDate.isOldFormat=!aDate.isOldFormat;cout<<weekdays[aDate.dayOfWeek]<<" "<<aDate.dayOfMonth;if(aDate.isOldFormat)cout<<"*";cout<<" "<<months[aDate.month]<<" "<<aDate.year<<"\n";}intmain(){cin.tie(0);cout.sync_with_stdio(false);string weekDayText,monthText;date aDate;while(cin>>weekDayText,weekDayText!="#"){cin>>aDate.dayOfMonth>>monthText>>aDate.year;aDate.dayOfWeek=find(weekdays,weekdays+7,weekDayText)-weekdays;aDate.month=find(months,months+12,monthText)-months;convertToOtherDate(aDate);}return0;}

总结

本题通过历法转换与星期匹配,考查了对日期处理的基本能力。关键在于理解两种历法的闰年规则和历史上的日期调整,以及如何通过星期信息判断原历法类型。算法上,我们采用统一的基准日期,分别计算天数,再根据星期匹配进行转换。代码中注意处理闰年和月份天数,确保转换的准确性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 7:11:20

商城活动说明

一、活动说明抽奖活动凭借着以小博大的杠杆效应、低门槛参与、高奖励诱惑的活动机制&#xff0c;无论是线下门店促销&#xff0c;还是线上活动&#xff0c;都被广泛用于拉新、促活、获客等增长环节。二、功能说明系统提供的抽奖环节有&#xff1a;积分抽奖&#xff0c;下单支付…

作者头像 李华
网站建设 2026/6/16 4:12:32

25.4 进度类

&#x1f31f; 一、单代号网络图&#xff08;PDM / 前导图法&#xff09;✅ 定义前导图法&#xff08;Precedence Diagramming Method, PDM&#xff09;&#xff1a;用矩形/方框&#xff08;节点&#xff09;表示活动&#xff0c;箭头表示逻辑关系。节点需编号&#xff0c;箭线…

作者头像 李华
网站建设 2026/6/23 15:31:04

收藏!2025秋招真相:IT仍是王者,AI算法岗年薪40万领跑全场

秋招战场的冰火两重天&#xff0c;今年格外刺眼。一边是无数毕业生为“月薪过万”辗转焦虑&#xff0c;投出的简历石沉大海&#xff1b;另一边&#xff0c;不少瞄准热门赛道的毕业生&#xff0c;早已将“年薪40万”纳入囊中之物&#xff0c;成为秋招里的“天选赢家”。 近日&a…

作者头像 李华
网站建设 2026/6/15 16:18:48

Therma Wave 14-004693

产品概述Therma Wave 14-004693 Rev D是用于半导体制造或检测设备的电气总成组件&#xff0c;通常与晶圆处理或真空系统相关。该型号可能涉及温度控制、真空环境维持或信号传输功能&#xff0c;具体应用取决于设备型号。功能特点晶圆处理&#xff1a;可能包含晶圆定位、温度监控…

作者头像 李华
网站建设 2026/6/21 10:52:14

[运营进阶] 店铺图片风格杂乱?浅析如何利用 AI 批量统一视觉规范,打造“大牌感”Listing

品牌出海 视觉营销 跨境电商 AI工具 自动化办公 图片处理前言在跨境电商从“野蛮生长”转向“品牌出海”的今天&#xff0c;Listing 的视觉质量 往往决定了买家对品牌的首因效应。对于拥有独立供应链的大卖来说&#xff0c;他们可以花费巨资统一拍摄、统一修图。但对于大多数中…

作者头像 李华
网站建设 2026/6/21 20:58:35

基于级联前向BP神经网络(CFBP)的数据回归预测及Matlab实现

基于级联前向BP神经网络(CFBP)的数据回归预测 CFBP回归 matlab代码 注&#xff1a;暂无Matlab版本要求 -- 推荐 2018B 版本及以上 在数据预测领域&#xff0c;神经网络一直是备受瞩目的工具。今天咱们来聊聊基于级联前向BP神经网络&#xff08;CFBP&#xff09;的数据回归预测&…

作者头像 李华