First Date (hnoj12952)日期计算

First Date
Time Limit: 3000ms, Special Time Limit:7500ms, Memory Limit:65536KB
Total submit users: 77, Accepted users: 46
Problem 12952 : No special judgement
Problem description

Given the last day for which the Julian calendar is in effect for some country (expressed as a Julian date), determine the next day’s Gregorian date, i.e., the first date that uses the Gregorian calendar.

Input

For each test case, the input consists of one line containing a date in the
Julian calendar, formatted as YYYY-MM-DD. This date will be no earlier than
October 4, 1582, and no later than October 18, 9999. The given date represents
the last day that the Julian calendar is in effect for some
country.

Output

For each test case, print the first Gregorian date after the calendar
transition.

Sample Input
1582-10-04
1752-09-02
1900-02-25
1923-02-15
Sample Output
1582-10-15
1752-09-14
1900-03-10
1923-03-01

题意:J日历闰年只要被4整除;G日历能被4整除但不能被100整除,或者能被400整除的是闰年;

  先在已知J的日历日期,问你G的日历显示的日期?

表示自己不会算钱,这次连日子都算不好。。。。。。。。。。。。。悲剧!

这次就被黑在这里了。。。。。无语。

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12952

AC代码:

#include<stdio.h>

void Print(int h,int m,int s)
{
    printf("%d",h);

    if(m>9) printf("-%d",m);
    else     printf("-0%d",m);
    if(s>9) printf("-%d\n",s);
    else     printf("-0%d\n",s);
}
int main()
{
    int i,j,d;
    int sum;
    int hh,mm,ss;
    int year,mouth,day;
    int s1[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int s2[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
while(~scanf("%d-%d-%d",&hh,&mm,&ss))
    {

        int fa,fb,fc,fd;
//           fa=hh/4;
        fb=hh/100;
        fc=hh/400;
        fd=fb-fc-1;
        year=hh;
        mouth=mm;
        day=ss+fd;
//           printf("%d\t%d\t%d\t%d\n",fa,fb,fc,fd);
        sum=0;
//           printf("%d\n",day);
        if(year%100==0&&year%400!=0&&mm<=2)
            day--;
        for(i=mm; i<13; i++)
        {
            //          sum+=s1[i];
            if(i==2&&((year%4==0&&year%100!=0)||year%400==0))
            {
                if(day>29)
                {
                    day-=29;
                    mouth++;
                    if(mouth>12)
                    {
                        mouth=1;
                        i=0;
                        year++;
                    }
                }
                else
                    break;
            }

            else if(day>s1[i])
            {
                day-=s1[i];
                mouth++;
                if(mouth>12)
                {
                    mouth=1;
                    i=0;
                    year++;
                }
            }
            else
                break;

        }
        Print(year,mouth,day);
    }
    return 0;
}

超时,和RE的代码。。。。呜呜,过不了

why?

#include<stdio.h>
#include<string.h>

#define ll __int64

int leapj(ll y)
{
    if(y%4==0)
        return 1;
    else
        return 0;
}
int leapg(ll y)
{
    if(((y%4==0)&&(y%100!=0))||(y%400==0))
        return 1;
    else
        return 0;
}

void Print(ll h,ll m,ll s)
{
    printf("%I64d",h);

    if(m>9) printf("-%I64d",m);
    else     printf("-0%I64d",m);
    if(s>9) printf("-%I64d\n",s);
    else     printf("-0%I64d\n",s);
}
int main()
{
    ll i,j,d;
    ll num;
    ll hh,mm,ss;
    ll HH,MM,SS;
    ll s1[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
    ll s2[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
    ll s3[13]= { 0,0, 0, 0, 0, 0, 0, 0, 0, 0,27,30,31};
    while(~scanf("%I64d-%I64d-%I64d",&hh,&mm,&ss))
    {
        ll a=(hh-1580)/4;
        if(leapj(hh)&&(mm==1||mm==2)&&ss<29)
            a--;

//        printf("a    %d\n",a);

        num=(hh-1582)*365+a+11;
        if(hh>1582)
        {
            for(j=1;j<mm; j++)
            {
                num+=s1[j];
            }
 //           if(leapj(hh)&&(mm==2&&ss==29||mm>2))
 //               num++;
            num+=ss;
        }
//        printf("num    %I64d\n",num);
//        printf("hh   %d\n",hh);
        if(hh==1582&&num<=88)
        {
            for(j=10; j<13; j++)
            {
                if(num>s3[j])
                {
                    num-=s3[j];
                    mm++;
                }
                else
                    break;
            }
            ss+=num;
            Print(hh,mm,ss);
        }

        else
        {
        //    num-=365;
//           printf("hh    %d\n",hh);
            HH=1583;

            while(num>=366)
            {
//              printf("%I64d\t%d\n",num,hh);
                num-=365;
                if(((HH%4==0)&&(HH%100!=0))||(HH%400==0))
                    num--;
                HH++;
            }

            MM=0;
            SS=0;
 //         printf("%I64d    %I64d\n",num,HH);
            if(leapg(HH))
            {
                for(j=1; j<13; j++)
                {
                    MM++;
                    if(num>s2[j])
                    {
                        num-=s2[j];
                    }
                    else
                        break;
                }
                SS=num;
            }
            else
            {
                for(j=1; j<13; j++)
                {
                    MM++;
                    if(num>s1[j])
                    {
                        num-=s1[j];
                    }
                    else
                        break;
                }
                SS=num;
            }

            Print(HH,MM,SS);
        }

    }
    return 0;
}
时间: 2024-10-13 10:16:07

First Date (hnoj12952)日期计算的相关文章

iOS学习笔记37-时间和日期计算

一.时间和日期计算 我们在应用开发中,时常需要和时间打交道,比如获取当前时间,获取两个时间点相隔的时间等等,在iOS开发中与时间相关的类有如下几个: 1. NSDate:表示一个绝对的时间点 2. NSTimeZone:时区信息 3. NSLocale:本地化信息 4. NSDateComponents:一个封装了具体年月日.时秒分.周.季度等的类 5. NSCalendar:日历类,它提供了大部分的日期计算接口 6. NSDateFormatter:用来在日期和字符串之间转换 二.NSDate

PHP 日期格式化和日期计算以及获取当前周、月头尾日期

PHP 日期格式化和日期计算以及当获取前周.月头尾日期 PHP 日期格式化示例代码: /** * 格式化时间 * $type:类型 * $strDate:需要处理的时间字符串 * * 年份 Y:四位年份 y:两位年份 * 月份 m: 两位数字月份 n: 一位数字月份 M:英文月 * 日期 d:两位数字日期 j:一位数字日期 D:英文日期 * 时:H .分:i .秒:s **/ public function GetFormatDate($type = 1,$strDate=''){ $time

php 日期 - 计算2个日期的差值

1 /** 2 * 日期-计算2个日期的差值 3 * @return int 4 */ 5 public function get_difference($date, $new_date) { 6 $date = strtotime($date); 7 $new_date = strtotime($new_date); 8 return abs(ceil(($date - $new_date)/86400)); 9 }

JS nodeJs 的日期计算

date-utils 前端引用 <script type="text/javascript" src="date-utils.min.js"></script> 下载传送门,猛击我 NODEJS服务端项目调用 $ cnpm install date-utils require('date-utils'); nodejs版本要求>0.6 API : Static Methods 静态方法 Date.today(); // today, 0

CalendarHelper日期计算工具,各种日期的获取和计算

今天分享一个日期获取和计算的工具类,这个最初是用在项目中获取每周每月日期用的. package com.ran.interview; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; /** * @auth

java实现的日期计算

这里讲的日期计算比较偏,用到的地方很少(比如获取今天所在周的周一或者周日,获取今天是本月的第几周...),这些方法是以前做项目遗留下来的,现在整理一下,跟大家分享. 工具类主要有一下方法: public static Date getFirstMondayOfMonth(String dateString, String dateFormat) throws Exception 获取指定月份的第一个星期一,比如2014-12 月的第一个周一是2014-12-01 public static in

javascript的日期对象Date操作时间日期值

创建一个日期对象: var objDate=new Date([arguments list]); 我总结了参数形式主要有以下3种: new Date("month dd yyyy hh:mm:ss");//后面的hh:mm:ss可选(不选的话就是默认的开始时间),而且前三项的顺序可以随意,甚至各字段后面可以加逗号 new Date(yyyy,mth,dd,hh,mm,ss); //除了前两个字段(年.月字段)外,其余的都是可选的(不选的话就默认为开始的),不过,此处顺序最好别随意变换

javascript、php与mysql日期计算函数

javascript: /** * 日期计算类 * @author [lee] <[<www.dollarphp.com>]> * @param dur 增量 如:+1day -5 year 6months * @param time 传入时间 支持格式 1.y-m-d H:i:s 2.1111111111 * @return 字符串 如:2018-01-01 00:00:00 */ function dateParse(time = false,dur){ this.getDat

JAVA中日期转换和日期计算的方法

日期的格式有很多形式,在使用过程中经常需要转换,下面是各种类型转换的使用例子以及日期计算方法的例子. 一.不同格式日期相互转换方法 1 public class TestDateConvertUtil { 2 3 public static void main(String[] args) throws ParseException { 4 // 获取当前时间 5 Date date = new Date(); // 获取当前时间 6 long timestamp = System.curren

js时间戳转换日期格式和日期计算

一.时间戳转换日期 1 function formatDate(datetime) { 2 // 获取年月日时分秒值 slice(-2)过滤掉大于10日期前面的0 3 var year = datetime.getFullYear(), 4 month = ("0" + (datetime.getMonth() + 1)).slice(-2), 5 date = ("0" + datetime.getDate()).slice(-2), 6 hour = (&quo