【蓝桥OJ——C语言】顺子日期、特殊时间、乘积尾零

简介: 2022 年 2 月 22 日 22:20 是一个很有意义的时间, 年份为 2022 , 由 3 个 2 和 1 个 0 组成, 如果将月和日写成 4 位, 为 0222 , 也是由 3 个 2 和 1 个 0 组 成, 如果将时间中的时和分写成 4 位, 还是由 3 个 2 和 1 个 0 组成。

顺子日期


小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022 年份中,一共有多少个顺子日期?


python方法:


from datetime import *
# 日期转换为字符串,判断是否为顺子日期
dt = datetime(2022,1,1)
count = 0
for i in range(0,365):
    s="%02d%02d%02d" %(dt.year,dt.month,dt.day)
    dt += timedelta(days=1)
    if '012' in s or '123' in s or '234' in s or '345' in s \
        or '456' in s or '678' in s or '789' in s:
        count = count+1
print(count)


C语言方法:


#include <stdio.h>
#include <stdlib.h>
int main(){
//  定义总数,月份,日期,每月的天数 
  int count,month,day,dcnt;
//  对月份进行循环 
  for(month=1;month<=12;month++){
//    如果该月为2月,则天数为28 
    if(month==2){
      dcnt=28;
    }
//    如果该月为1,3,5,7,8,10,12,则天数为31 
    if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
      dcnt=31;
    }
//    如果该月为4,6,9,11,则天数为30 
    if(month==4 || month==6 || month==9 || month==11){
      dcnt=30;
    }
//对天数进行循环,month/10是十位数,month%10是个位数,day/10是十位数,day%10是个位数
//如果两个差值是1,也就是后一个数比前一个数大1,则为顺子日期。
//这里分为两种情况。
    for(day=1;day<=dcnt;day++){
    if((month/10==(month%10)-1 && month%10==(day/10)-1) || (month%10==(day/10)-1 && day/10==(day%10)-1)){
      count++;
    }
  }
  }
  printf("%d",count);
  return 0;
}


特殊时间


2022 年 2 月 22 日 22:20 是一个很有意义的时间, 年份为 2022 , 由 3 个 2 和 1 个 0 组成, 如果将月和日写成 4 位, 为 0222 , 也是由 3 个 2 和 1 个 0 组 成, 如果将时间中的时和分写成 4 位, 还是由 3 个 2 和 1 个 0 组成。


小蓝对这样的时间很感兴趣, 他还找到了其它类似的例子, 比如 111 年 10 月 11 日 01:11,2202 年 2 月 22 日 22:02 等等。


请问, 总共有多少个时间是这种年份写成 4 位、月日写成 4 位、时间写成 4 位后由 3 个一种数字和 1 个另一种数字组成。注意 1111 年 11 月 11 日 11:11 不算,因为它里面没有两种数字。


#include<stdio.h>
int main()
{
    int a = 0;
//    枚举两个数可能相等的所有可能 
    for (int i = 0; i <= 9; i++)                //出现一次的数字 i
    {
        for (int j = 0; j <= 9; j++)            //出现三次的数字 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 行数据,每行有 10 个整数,请你求出它们的乘积的末尾有多少个零?


5650 4542 3554 473 946 4114 3871 9073 90 4329 
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 
1486 5722 3135 1170 4014 5510 5120 729 2880 9019 
2049 698 4582 4346 4427 646 9742 7340 1230 7683 
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 
6701 6645 1671 5978 2704 9926 295 3125 3878 6785 
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 
689 5510 8243 6114 337 4096 8199 7313 3685 211 


思路:


10=2*5,所以统计乘积中有多少个2和5的因子,所以有多少个5就有多少个0,统计5的个数就可以得到末尾0的个数。


#include <stdio.h>
#include <stdlib.h>
int main(){
  int cnt = 0;//总数 
  for(int i=0;i<100;++i){
    int x;  
    scanf("%d\n",&x); //输入100个数字 
    while(x%5==0){
      cnt++;
      x = x/5;
    }
 }
 printf("%d\n",cnt);
  return 0;
}


总结


以上就是今天的学习内容啦~

如果有兴趣的话可以订阅专栏,持续更新呢~

咱们下期再见~


4bcb9e2421cd4581be84d8888ad65612.gif

目录
相关文章
|
3天前
|
C语言
C语言Oj题判断素数几种方式详解
输入一个数判断它是不是素数,并且不是的情况把它打印出来不是素数。
|
6月前
|
C语言
C语言每日一题 ----计算日期到天数转换(Day 2)
C语言每日一题 ----计算日期到天数转换(Day 2)
65 0
|
9月前
|
存储 C语言
如何在C语言中进行日期和时间处理
日期和时间处理在许多软件和应用程序中都是非常重要的功能。无论是计算两个日期之间的天数,还是计算某个日期是星期几,C语言提供了丰富的库函数和功能来满足这些需求。本文将介绍如何在C语言中进行日期和时间处理
123 0
|
10月前
|
存储 算法
(C语言版)力扣(LeetCode)+牛客网(nowcoder)二叉树基础oj练习
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
(C语言版)力扣(LeetCode)+牛客网(nowcoder)二叉树基础oj练习
|
10月前
|
算法 C语言 C++
(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析(下)
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
|
10月前
|
算法
(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析(上)
递归的写法看起来简洁,实际并没有迭代写法好理解,而且在空间复杂度上也比迭代高,这里的递归写法思路主要是先向下找到尾结点后,向上逐个返回,如果等于val值,就将该节点上一个元素直接指向该节点下一个元素,等于是将该点从链表中删除了
(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析(上)
|
10月前
|
存储
(C语言版)力扣(LeetCode)数组相关面试题OJ题解析(下)
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
|
10月前
(C语言版)力扣(LeetCode)数组相关面试题OJ题解析(上)
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
|
11月前
|
存储 C语言 C++
栈和队列OJ题思路分享之栈和队列互换(C语言实现)
我们紧接上一章的刷题分享来把后面两个题给搞定,它们分别是: 1. 用队列实现栈: 力扣225题— 2. 用栈实现队列: 力扣232题. 如果你还没有自己实现过栈和队列,或者没有栈和队列的现成结构,请跳转栈和队列详解,或者去我的码云自取. 这里的题目需要使用自己实现过的结构!
|
11月前
|
测试技术 C语言
栈和队列OJ题思路分享之括号匹配(C语言实现)
我们不久前给大家介绍了栈和队列这两种全新的结构,力扣上面有一些关于栈和队列的OJ题是非常经典的,这里我一共要给大家做三道题目的分享,分别是 1. 括号匹配问题: 力扣20题— 2. 用队列实现栈: 力扣225题— 3. 用栈实现队列: 力扣232题.今天这一章先分享第一个问题:括号匹配问题