当前位置:   article > 正文

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

顺子日期


顺子日期

小明特别喜欢顺子。顺子指的就是连续的三个数字: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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

特殊时间

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

乘积尾零

如下的 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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

思路:
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

总结

以上就是今天的学习内容啦~
如果有兴趣的话可以订阅专栏,持续更新呢~
咱们下期再见~在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/398742
推荐阅读
相关标签
  

闽ICP备14008679号