蓝桥杯-回文日期(两种写法)

在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。

牛牛习惯用 8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月份,最后 2 位代表日期。

显然:一个日期只有一种表示方法,而两个不同的日期的表示方法不会相同。

牛牛认为,一个日期是回文的,当且仅当表示这个日期的 8 位数字是回文的。

现在,牛牛想知道:在他指定的两个日期之间(包含这两个日期本身),有多少个真实存在的日期是回文的。

一个 8 位数字是回文的,当且仅当对于所有的 i
(1≤i≤8) 从左向右数的第 i 个数字和第 9−i 个数字(即从右向左数的第 i 个数字)是相同的。

例如:

对于 2016 年 11 月 19 日,用 8 位数字 20161119 表示,它不是回文的。
对于 2010 年 1 月 2 日,用 8 位数字 20100102 表示,它是回文的。
对于 2010 年 10 月 2 日,用 8 位数字 20101002 表示,它不是回文的。

输入格式

输入包括两行,每行包括一个 8 位数字

第一行表示牛牛指定的起始日期 date1,第二行表示牛牛指定的终止日期 date2。保证 date1 和 date2 都是真实存在的日期,且年份部分一定为 4 位数字,且首位数字不为 0。

保证 date1 一定不晚于 date2。

输出格式

输出共一行,包含一个整数,表示在 date1 和 date2 之间,有多少个日期是回文的。

输入样例:

20110101
20111231

输出样例:

1

题解:

一共有两种写法:

  1. 枚举前四位数, 后四位是前四位的回文, 判断这个日期是否是合法的,以及是否在开始日期和结束日期之间
  2. 枚举后四位数, 前四位是后四位的会问, 判断这个日期是否在开始日期和结束日期之间

之所以第2种没有判断这个日期是否合法, 是因为 后四位是month和day, 它们各个位的数据范围不超过3, day最大是31, month最大是12, 而前四位各个位最大都可以是9, 所以date一定合法

枚举前四位
ac代码👇

#include <bits/stdc++.h>
using namespace std;

int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool check(int date)
{
    int year = date / 10000;
    int month = date % 10000 / 100;
    int day = date % 100;
    
    if (month <= 0 || month >= 13 || day <= 0 || day >= 32) return false;

    // 二月需要特殊处理
    // 是闰年, 且2月的day > 29
    if ((year % 2 == 0 && year % 100 != 0 || year % 400 == 0) && month == 2 && day > 29) return false;

    // 不是闰年, 且2月的day > 28
    if (!(year % 2 == 0 && year % 100 != 0 || year % 400 == 0) && month == 2 && day > 28) return false;

    // 除了二月, 其他月份的day大于 days
    if (month != 2 && day > days[month]) return false;
    
    return true;
}

int main()
{
    int a, b; cin >> a >> b;
    
    int res = 0;
    for (int i = 0; i <= 9999; i ++)
    {           // 👇日期的前四位 👇 日期的第五位       👇日期的第6位         👇日期的第7位        👇日期的第8位
        int date = i * 10000 +     1000 * (i % 10) +   100 * (i / 10 % 10) + 10 * (i / 100 % 10) + i / 1000;

        if (date >= a && date <= b && check(date)) res ++;
    }
    
    cout << res << endl;
    return 0;
}

枚举后四位

注意事项:

  • 如果mouth是2并且满足时回文的话, 那么一定是闰年, 因为 mouth是2时的回文数列中 year的后两位一定是20, 即 xx20

ac代码👇

#include <bits/stdc++.h>
using namespace std;

int days[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{
    int a, b; cin >> a >> b;
    
    int res = 0;
    for (int mouths = 1; mouths <= 12; mouths ++)
        for (int day = 1; day <= days[mouths]; day ++)
        {               // 👇 取 day 的第一位    👇取day的第二位  👇 取mouths的第一位  👇取mouths的第二位
            int year = 1000 * (day % 10) + 100 * (day / 10) + 10 * (mouths % 10) + mouths / 10;
            int date = year * 10000 + mouths * 100 + day;
            if (date >= a && date <= b) res ++;
        }
    cout << res << endl;
    return 0;
}

觉得写的不错的话, 点个赞吧~

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在C#中添加ArcObjects库的引用。具步骤为: 1. 打开Visual Studio,创建一个新的C# Windows Forms应用程序项目。 2. 在解决方案资源管理器中右键单击“引用”文件夹,选择“添加引用”。 3. 在“添加引用”对话框中,选择“浏览”选项卡,并找到ArcObjects库的安装路径(一般位于ArcGIS安装目录下的“bin”文件夹中)。 4. 选择需要的ArcObjects库,然后单击“确定”按钮。 接下来,可以按照以下步骤编写代码来实现在地理数据库中新建要素类: 1. 在窗体上添加一个按钮控件,并给它命名为“btnCreateFeatureClass”。 2. 双击按钮控件,打开代码编辑器,并在其中添加以下代码: ```csharp using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.DataSourcesGDB; private void btnCreateFeatureClass_Click(object sender, EventArgs e) { // 获取工作空间 IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactory(); IWorkspace workspace = workspaceFactory.OpenFromFile("D:\\data.gdb", 0); // 创建要素类 IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace; IFields fields = new FieldsClass(); IFieldsEdit fieldsEdit = (IFieldsEdit)fields; IField field = new FieldClass(); IFieldEdit fieldEdit = (IFieldEdit)field; fieldEdit.Name_2 = "OBJECTID"; fieldEdit.Type_2 = esriFieldType.esriFieldTypeOID; fieldsEdit.AddField(field); fieldEdit = new FieldClass(); fieldEdit.Name_2 = "Name"; fieldEdit.Type_2 = esriFieldType.esriFieldTypeString; fieldEdit.Length_2 = 50; fieldsEdit.AddField(field); IFeatureClass featureClass = featureWorkspace.CreateFeatureClass("MyFeatureClass", fields, null, null, esriFeatureType.esriFTSimple, "Shape", ""); } ``` 其中,“D:\\data.gdb”是地理数据库文件的路径,可以根据实际情况进行修改。这段代码的功能是在指定的地理数据库中创建一个名为“MyFeatureClass”的要素类,该要素类包含一个名为“OBJECTID”的自动生成的唯一标识符字段和一个名为“Name”的字符串类型字段。 3. 运行程序,单击“btnCreateFeatureClass”按钮,即可在地理数据库中创建新的要素类。 需要注意的是,此代码示例只是演示如何在地理数据库中创建要素类,实际情况可能需要更复杂的代码来实现特定的要素类结构和字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值