栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

OpenJudge NOI 1.13 08:特殊日历计算

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OpenJudge NOI 1.13 08:特殊日历计算

【题目链接】

OpenJudge NOI 1.13 08:特殊日历计算

【题目考点】 1… 取模运算 【解题思路】

我们用的是现实日历,题目中设定的是特殊日历,两种历法的一天是一样长的。也就是说两种历法的秒的长度是不一样的。
先输入现实日历的日期。

1. 求时分秒

求出从当天0时0分0秒到当前时间h时m分s秒的总秒数ts,为ts=h*3600+m*60+s
现实日历中一天为 24 ∗ 60 ∗ 60 = 86400 24*60*60=86400 24∗60∗60=86400秒,特殊日历中一天为 10 ∗ 100 ∗ 100 = 100000 10*100*100=100000 10∗100∗100=100000秒。
将现实日历的秒数转为特殊日历中的秒数,需要做 t s / 86400 ∗ 100000 = t s ∗ 125 / 108 ts/86400*100000=ts*125/108 ts/86400∗100000=ts∗125/108,即ts = ts*125/108
而后在特殊日历中:
ts%100为秒数,ts/100%100为分钟数,ts/10000为小时数。

2. 求日月年

把2000年1月1日当做第0天,求出该日期是第几天。
设一个函数getDayNum获取y年m月d日是从2000年1月1日起的第几天。

  • i从2000遍历到y-1,根据第i年是否是闰年统计每年的天数,加和。
  • i从1遍历到m-1,统计第i月的天数,加和。
  • 最后天数加上d-1(由于日期从1开始)

用getDayNum函数求出总天数td,而后将该天数转为特殊日历中的日、月、年。
特殊日历中10天一周,10周一个月,也就是100天一个月。10个月1年。由于日、月从1开始,所以求出的数值要加1。
td%100+1即为日,td/100%10+1即为月,td/1000为年。

【题解代码】 解法1:
#include
using namespace std;
bool isLeap(int y)//y是否是闰年 
{
    return y%400 == 0 || y%100 != 0 && y%4 == 0;
}
int getDayNum(int y, int m, int d)
{
    int day = 0;//从2000.1.1到y年m月d日的总天数
    for(int i = 2000; i < y; ++i)
    {
        if(isLeap(i))
            day += 366;
        else
            day += 365;
    }
    for(int i = 1; i < m; ++i)
    {
        if(i == 2)  
            day += isLeap(y) ? 29 : 28;
        else if(i == 4 || i == 6 || i == 9 || i == 11)
            day += 30;
        else
            day += 31;
    }
    day += d-1;
    return day;
}     
int main()
{
    int n, k, h, mi, s, d, mo, y, td, ts;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%d:%d:%d %d.%d.%d", &h, &mi, &s, &d, &mo, &y);//h:时 mi:分 s:秒 d:日 mo:月 y:年 
        ts = h*3600+mi*60+s;//从0:0:0到h:mi:s的总秒数 
        ts = ts*125/108;//将现实日历中的秒数转为特殊日历中的秒数。 
        s = ts%100, ts /= 100;//特殊日历下的秒、分、时 
        mi = ts%100, ts /= 100;
        h = ts;
        td = getDayNum(y, mo, d);//从1.1.2000到d.mo.y的总天数 
        d = td%100+1, td /= 100;//特殊日历下的日、月、年 
        mo = td%10+1, td /= 10;//日、月从1开始,所以要加1 
        y = td;
        printf("%d:%d:%d %d.%d.%dn", h, mi, s, d, mo, y);//注意:月日从1开始
    }
    return 0;
}
解法2:
#include
using namespace std;
bool isLeap(int y)//y是否是闰年 
{
    return y%400 == 0 || y%100 != 0 && y%4 == 0;
}
int getDayNum(int y, int m, int d)
{
    int day = 0;//从2000.1.1到y年m月d日的总天数
    for(int i = 2000; i < y; ++i)
    {
        if(isLeap(i))
            day += 366;
        else
            day += 365;
    }
    for(int i = 1; i < m; ++i)
    {
        if(i == 2)  
            day += isLeap(y) ? 29 : 28;
        else if(i == 4 || i == 6 || i == 9 || i == 11)
            day += 30;
        else
            day += 31;
    }
    day += d-1;
    return day;
}     
int main()
{
    int n, k, h, mi, s, d, mo, y, td, ts;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%d:%d:%d %d.%d.%d", &h, &mi, &s, &d, &mo, &y);//h:时 mi:分 s:秒 d:日 mo:月 y:年 
        ts = h*3600+mi*60+s;//从0:0:0到h:mi:s的总秒数 
        ts = ts*125/108;//将现实日历中的秒数转为特殊日历中的秒数。 
        s = ts%100;//特殊日历下的秒、分、时 
        mi = ts/100%100;
        h = ts/10000;
        td = getDayNum(y, mo, d);//从1.1.2000到d.mo.y的总天数 
        d = td%100+1;//特殊日历下的日、月、年 
        mo = td/100%10+1;//日、月从1开始,所以要加1 
        y = td/1000;
        printf("%d:%d:%d %d.%d.%dn", h, mi, s, d, mo, y);//注意:月日从1开始
    }
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/916979.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号