计蒜客428俩个8位制年月日之间的差值

本文探讨了一种独特的日期验证方法,通过计算日期各部分的笔画数与给定数字的匹配,揭示了日期与数字之间的数学联系。利用C++实现,展示如何通过编程解决日期与数字笔画的趣味问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

月份打表,数字笔画打表,使用月份的二维数组判断日期的合法性,

使用数字的一维数组直接计算日期的笔画数,计算年差值,用各自的

总和相减即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;
int num[10]={6,2,5,5,4,5,6,3,7,6};
int yue[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31};
int a,b,c;
int is_run(int year)
{
    if((year%4==0&&year%100!=0)||year%400==0)
        return 1;
    return 0;
}
int is(int t1,int t2,int t3)
{
    if(t3>yue[is_run(t1)][t2])
        return 0;
    if(t1<a||(t1==a&&t2<b)||(t1==a&&t2==b&&t3<c))
    {
        // cout<<"hehe"<<endl;
         return 0;
    }
    return 1;
}
int cyear(int t1,int t2,int t3)
{
    int sum=0;
    for(int i=1;i<t1;i++)
    {
        if(is_run(i))
            sum+=366;
        else
            sum+=365;
    }
    for(int i=1;i<t2;i++)
        sum+=yue[is_run(t1)][i];
    sum+=t3;
    return sum;
}
int main()
{
    int t;
   cin>>t;
   while(t--)
   {
       string s;
       cin>>s;
       int m;
       cin>>m;
        a=(s[0]-'0')*1000+(s[1]-'0')*100+(s[2]-'0')*10+s[3]-'0';
        b=(s[4]-'0')*10+s[5]-'0';
        c=(s[6]-'0')*10+s[7]-'0';
      //  cout<<is(2015,7,18)<<endl;
       // cout<<a<<' '<<b<<' '<<c<<endl;
        int flag=0;
        for(int i=a;i<3000;i++)
        {

            for(int j=1;j<13;j++)
            {

                for(int k=1;k<32;k++)
                {
                    int total=0;
                    if(!is(i,j,k))
                        continue;
                    total=num[i/1000]+num[i/100%10]+num[i/10%10]+num[i%10]+num[j/10]+num[j%10]+num[k/10]+num[k%10];
                    if(total==m)
                    {
                      //  cout<<total<<endl;
                       // cout<<i<<' '<<j<<' '<<k<<endl;
                        cout<<cyear(i,j,k)-cyear(a,b,c)<<endl;
                        flag=1;
                        break;
                    }
                }
                if(flag)
                    break;
           }
        if(flag)
            break;
        }
        if(!flag)
            cout<<-1<<endl;
   }
   return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值