18岁生日(闰年判断+水)

Description
当你还是18岁的时候,那个曾经一起追过的女孩刚好也是18岁,而且她的生日就要到了,你突然想到一个问题,是不是每个人到18岁生日所经过的天数都是一样的呢?我们来算一下吧
Input
首先输入一个整数n,表示有n组数据,格式是YYYY-MM-DD。
Output
对于每组数据输出一行,每行一个数,表示从出生到18岁生日所经过的天数。如果没有18岁生日,就输出-1。
Sample Input

2
1992-2-1
1988-3-5
Sample Output

6575
6574

题解:1、要求里的没有18岁生日仅仅指于闰年的2月29日出生,不代表还没有到18岁就是没有生日。
2、计算18年有多少天,无非就是判断这18年里有几个闰年,出生那年过的天数加上18岁那年过的天数可以凑齐为一年。
3、判断生日在2月28之前还是之后,如果在之后就判断出生那年的下一年开始,往后18年里几个闰年,之前就判断从出生那年开始,往后18年里有几个闰年。

代码(C)

#include<stdio.h>
int main()
{
    int n,d,y,m,sum;
    scanf("%d",&n);
    for(int j=1;j<=n;j++)
    {
        sum=0;
        scanf("%d-%d-%d",&y,&m,&d);
        if(m==1)//分月份判断生日在2月28之前还是之后
        {
            for(int i=y;i<y+18;i++)
            {
                if((i%4==0&&i%100!=0)||i%400==0)
                {
                    sum=sum+366;
                }
                else  sum=sum+365;
            }
        }
        else if(m>2)
        {
            for(int i=y+1;i<=y+18;i++)
            {
                if((i%4==0&&i%100!=0)||i%400==0)
                {
                    sum=sum+366;
                }
                else  sum=sum+365;
            }
        }
        else if(m==2)
        {
            if(d==29)  sum=-1;
            else
            {
                for(int i=y;i<y+18;i++)
                {
                    if((i%4==0&&i%100!=0)||i%400==0)
                    {
                        sum=sum+366;
                    }
                    else  sum=sum+365;
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}
在C++中,你可以通过`<chrono>`库来处理日期和时间,并利用`std::chrono::days`类型计算两个日期之间的差异。首先,你需要获取当前日期和用户的生日。假设我们已经有了一个表示用户生日的`std::chrono::system_clock::time_point`对象`birthday`。 ```cpp #include <iostream> #include <chrono> // 假设有一个函数或者构造函数获取生日 std::chrono::system_clock::time_point getBirthday() { // ... 从数据库或配置文件获取生日 } int main() { auto now = std::chrono::system_clock::now(); // 获取当前时间 auto current_date = std::chrono::system_clock::to_time_t(now); std::tm t = *std::localtime(&current_date); // 假设生日是一个结构体,包含年、月、日 std::tm birthday_t = {t.tm_year + 1900, t.tm_mon + 1, t.tm_mday}; // 将tm转换为系统时钟的时间点 auto birthday = std::chrono::system_clock::from_time_t(std::mktime(&birthday_t)); // 计算两个日期之间的差值(忽略时间部分) auto difference = std::chrono::duration_cast<std::chrono::days>(now - birthday).count(); int days_since_birth = difference; if (isLeapYear(t.tm_year)) { // 判断是否为闰年 // 如果要考虑闰年的规则,你需要添加额外的检查 // 比如闰年2月有29天而不是28天 } std::cout << "距离生日还有 " << days_since_birth << " 天" << std::endl; return 0; } bool isLeapYear(int year) { if (year % 4 != 0) return false; else if (year % 100 != 0) return true; else if (year % 400 != 0) return false; else return true; // 是闰年 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值