楠木青花 发表于 2016-11-29 23:29:39

计算到达18岁生日所经过的总天数

Problem DescriptionGardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。

Input一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。

OutputT行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。

Sample Input
11988-03-07

Sample Output
6574
新手求解 最好能有详细的注释
谢谢各位大神{:7_139:}

会魔法的魔法 发表于 2016-11-30 11:31:55

(出生时间戳-生日时间戳)/(60*60*24)

楠木青花 发表于 2016-11-30 12:42:54

会魔法的魔法 发表于 2016-11-30 11:31
(出生时间戳-生日时间戳)/(60*60*24)

我试试{:10_291:}

楠木青花 发表于 2016-11-30 12:55:27

会魔法的魔法 发表于 2016-11-30 11:31
(出生时间戳-生日时间戳)/(60*60*24)

我还没学时间戳 有没有别的方法呀{:9_228:}

zzzz76 发表于 2016-11-30 16:38:36

给你一个思路
你可以以数组的形式建立一个年历表{:10_256:}

zzzz76 发表于 2016-11-30 17:57:26

/*1、年份能被4整除;
2、年份若是100的整数倍的话,需被400整除,否则是平年
*/
#include <stdio.h>
#include <stdlib.h>
int main(){
        int a;
        int b = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};/* 平年月历表 */
        int year1, mouth1, day1;        /* 起始日期 */
        int year2, mouth2, day2;        /* 结束日期 */
        int count1 = 0;        /* 计数器 */
        int count2 = 0;

       
        //建立一个年历表
        for(int i = 1; i <=2016; i++){
                if(i%100 == 0){
                        if(i%400 == 0){
                                a = 366;
                        }
                        else{
                                a = 365;
                        }
                }
                else{
                        if(i%4 == 0){
                                a = 366;
                        }
                        else{
                                a = 365;
                        }
                }
        }
                       
        printf("请输入开始日期(xxxx-xx-xx):");
        scanf("%d-%d-%d", &year1, &mouth1, &day1);
       
        if(a == 366){
                b = 29;        /* 根据平年还是闰年修改月历表 */
        }
        else{
                b = 28;
        }
       
        if(day1 > b){
                printf("该日期不存在");
                exit(-1);       /* 结束 */
        }
       
        for(int i = 1; i < mouth1; i++){        /* 从开始年份的第一天到开始日期的天数 */
                count1 += b;
        }       
        count1 += day1;
       

        printf("请输入结束日期(xxxx-xx-xx):");
        scanf("%d-%d-%d", &year2, &mouth2, &day2);
       
        if(a == 366){
                b = 29;
        }
        else{
                b = 28;
        }
       
        if(day2 > b){
                printf("该日期不存在");
                exit(0);
        }
       
        for(int i = year1; i < year2; i++){                /* 从开始年份的第一天到结束日期的天数*/
                count2 += a;
        }
       
        for(int i = 1; i < mouth2; i++){
                count2 += b;
        }
        count2 += day2;
       
        printf("中间间隔的天数:%d", count2 - count1);
       
       
        return 0;
}

原来有人4年过一轮生日........

DarkSE 发表于 2016-11-30 23:47:17

其实还有另外一种方式:18岁的生日的话,期间一定会有3个完整的4年(把4年做一个周期),然后处理一下头尾的规律……下午帮你算的时候,算到最后才发现原来这个题目对18岁生日的定义是你出生的日期到第一个生日算一岁,而不是法律上的定义{:10_247:}所以楼主自己搞喽

楠木青花 发表于 2016-12-1 20:32:01

DarkSE 发表于 2016-11-30 23:47
其实还有另外一种方式:18岁的生日的话,期间一定会有3个完整的4年(把4年做一个周期),然后处理一下头尾 ...

{:10_266:}

楠木青花 发表于 2016-12-1 20:34:46

我找到答案了 {:10_266:}
计算方法:
<1>、将出生年经过的天数与18岁那年经过的天数加在一起算作一年。
<2>、不算闰年,则18年共度过18*365天。
<3>、考虑闰年,出生年与18岁生日合在一起那年单独考虑,其他年份只要是闰年,总天数加1天即可。
<4>、单独考虑合在一起年份,若出生年是闰年,且在2月29日之前出生,那么他(她)必定经过2月29日这天,总天数加1;对于18岁那年,若是闰年,且在2月28日之后出生的,他(她)同样经过2月29这天,总天数加1.
页: [1]
查看完整版本: 计算到达18岁生日所经过的总天数