蓝桥杯练习—特殊时间

题目描述

2022 年 2 月 22 日 22: 2022:20 是一个很有意义的时间, 年份为 2022 , 由 3 个 2 和 1 个 0 组成, 如果将月和日写成 4 位, 为 0222 , 也是由 3 个 2 和 1 个 0 组 成, 如果将时间中的时和分写成 4 位, 还是由 3 个 2 和 1 个 0 组成。
小蓝对这样的时间很感兴趣, 他还找到了其它类似的例子, 比如 111 年 10 月 11 日 01: 11,220201:11,2202 年 2 月 22 日 22: 0222:02 等等。
请问, 总共有多少个时间是这种年份写成 4 位、月日写成 4 位、时间写成 4 位后由 3 个一种数字和 1 个另一种数字组成。注意 1111 年 11 月 11 日 11: 1111:11 不算,因为它里面没有两种数字。

分析

首先对年月日时分进行分析,年的取值范围是0-9999,所以在理论范围内年的取值是不受限制的,月的限制是1-12,日的限制是0-31(二月份的闰年不用考虑),时限制在0-23,分限制在0-59。由此可见,月日受到的限制最多,应该从月开始分析。穷举单次出现的的数与三次出现的数,对比是否有相等的情况,如果有,跳出本次循环。
for( int i = 0; i <= 9 ; ++ i )                //只出现一次的数字 
    {
        for( int j = 0 ; j <= 9 ; ++ j)            //出现三次的数字 
        {
            if(i == j)
            {
                continue;
            }
		}
	}
随后将单次出现的数放在四个数的所有位置(使用数组),然后将本数组改编为整数
 int sum = num[3] * 1000 + num[2] * 100 + num[1] * 10 + num[0];
随后将千百位和十个位分别提取出来作为月与日和时分,然后根据限制条件进行筛选
 int f = sum / 100, g = sum % 100;
                if(f >= 1 && f <= 12 && g >= 1 && g <= 30) //筛选月日
                {
                    b++;
                }
                if(f >= 0 && f <= 23 && g >= 0 && g <= 59) //筛选时分
                {
                    c++;
                } 
            }
随后将各数相乘后乘4(每组年有四种情况0111、1011、1101、1110),将每种情况相加,得出结果
a = a + 4 * b * c;

完整代码

#include<stdio.h>
int main()
{
    int a = 0;
    for( int i = 0; i <= 9 ; i++ )                //出现一次的数字 
    {
        for( int j = 0 ; j <= 9 ; j++)            //出现三次的数字 
        {
            if(i == j)
            {
                continue;
            }
            int num[4];
            int b = 0, c = 0;
            for( int d = 0 ; d < 4 ; d++)    //出现一次的数字出现的位置 
            {
                for( int e = 0 ; e < 4 ; e++)
                {
                    if(e == d)
                    {
                        num[e] = i;
                    } else {
                        num[e] = j;     
                    }
                }
                int sum = num[3] * 1000 + num[2] * 100 + num[1] * 10 + num[0];
                int f = sum / 100, g = sum % 100;
                if(f >= 1 && f <= 12 && g >= 1 && g <= 30) //筛选月日
                {
                    b++;
                }
                if(f >= 0 && f <= 23 && g >= 0 && g <= 59) //筛选时分 
                {
                    c++;
                } 
            }
            a = a + 4 * b * c;
        }
    }
    printf("%d", a);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值