【蓝桥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

相关文章
|
2月前
|
存储 C语言
【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)
【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)
|
2月前
|
算法 C语言
C语言——oj刷题——回文字符串
C语言——oj刷题——回文字符串
17 2
|
2月前
|
算法 C语言
C语言——oj刷题——字符串左旋和轮转数组
C语言——oj刷题——字符串左旋和轮转数组
25 1
|
2月前
|
C语言
C语言--生日日期输出--年月日,一行输出--之间没有间隔,若月份为个位,在前面添加0
C语言--生日日期输出--年月日,一行输出--之间没有间隔,若月份为个位,在前面添加0
|
2月前
|
C语言
C语言----开学----输出一个数字,表示开学日期是星期几
C语言----开学----输出一个数字,表示开学日期是星期几
|
2月前
|
C语言
C语言——oj刷题——猜数字游戏
C语言——oj刷题——猜数字游戏
13 0
|
2月前
|
编译器 C语言
C语言——oj刷题——判断闰年
C语言——oj刷题——判断闰年
17 0
|
2月前
|
C语言
C语言——oj刷题——找单身狗1
C语言——oj刷题——找单身狗1
22 0
|
2月前
|
C语言
C语言——oj刷题——找单身狗2
C语言——oj刷题——找单身狗2
24 0
|
2月前
|
算法 C语言
C语言——oj刷题——杨氏矩阵
C语言——oj刷题——杨氏矩阵
22 0