蓝桥杯Python竞赛准备(持续更新)
本文最后更新于 755 天前,其中的信息可能已经有所发展或是发生改变。

一:前言:

emmmm,最近报了蓝桥杯的比赛嘛,python那组的,本以为要花300RMB,但是呢,学校居然给报销~~~~~~(真好~),老师也给了我鼓励(说省三有手就行。。( ˘•ω•˘ )),既然报了,那就

稍稍用点心吧。。咕咕咕。。。于是就有了这篇文章,记录一下自己的学习进程。

二:竞赛题:

1.麦森数:

题目描述

形如 2^P 的素数称为麦森数,这时 P 一定也是个素数。但反过来不一定,即如果  是个素数,2^P-1 不一定也是素数。到 1998 年底,人们已找到了 37个麦森数。最大的一个是,它有 909526 位。麦森数有许多重要应用,它与完全数密切相关。

任务:从文件中输入 P(1000<P<3.1 * 10^6),计算 2P-1的位数和最后 500位数字(用十进制高精度数表示)

输入描述

输入一个整数 P(1000<P<3.1  * 10^6)

输出描述

输出 11行。

第 1 行:十进制高精度数 2^P-1的位数。

第 2-11 行:十进制高精度数 2^P-1 的最后 500位数字。(每行输出 50位,共输出 10行,不足 500位时高位补 0 )

输入输出样例

示例 1

输入

 1279

输出

 

386 
00000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000 
00000000000000104079321946643990819252403273640855 
38615262247266704805319112350403608059673360298012 
23944173232418484242161395428100779138356624832346 
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962 
50138443826029173234888531116082853841658502825560 
46662248318909188018470682222031405210266984354887 
32958028878050869736186900714720710555703168729087

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

 

解题过程的问题:

 

1.不知道如何限制每行输出的字符个数

2.不知道如何才能取出最后面的500位数字

3.不知道如何减少运算量

4.输出位数的方法比较恶心

 

参考答案

 import math
 P = int(input())
 x = pow(2,P)-1
 print(int(math.log10(2)*P)+1)  #这里的标准答案非常恶心,这个公式很难想,需要一定是数学基础,就是说一个数的位数可以由lg(x)+1得到然后把2^p带进去(来自数学大佬的解说)
 x =x % pow(10,500)           #将数字减小,否则后面的取余运算的时间会比较大,为什么要这样减小?
 l = []
 for i in range(500):
     i = l.append(x%10)
     x = x//10
 for i in range(499,-1,-1):
     print(l[i],end = "")
     if i % 50 ==0:      #控制每行输出50位
        print("")
                         

 

2.门牌制作:

小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

result = 0 
for i in range(1,2021) 
  x = list(str(i)) //list ->将元组或字符串转换为列表,把i转化成字符串,用count进行统计 
  b = x.count('2') //count统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置。 
  result += b 
print(b)

 

3.寻找2020

 

小蓝有一个数字矩阵,里面只包含数字 0 和 2。小蓝很喜欢 2020,他想找到这个数字矩阵中有多少个 2020 。小蓝只关注三种构成 2020 的方式:
• 同一行里面连续四个字符从左到右构成 2020。
• 同一列里面连续四个字符从上到下构成 2020。
• 在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。

• 在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。 例如,对于下面的矩阵:
220000
000000
002202
000000
000022
002020
一共有 5 个 2020。其中 1 个是在同一行里的,1 个是在同一列里的,3个是斜线上的。 小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一个文件里面,在试题目录下有一个文件 2020.txt,里面给出了小蓝的矩阵。 请帮助小蓝确定在他的矩阵中有多少个 2020。

求解过程中只需要区分好行列之间的关系即可,无思维含量

 content = []
with open('2020.txt') as fp: #打开文件的方式 
for line in fp.readlines(): #readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。 
content.append(list(line.strip())) # strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列,如果不这样会自动换行 

row = len(line) #一横排有多少 
col = len(content) #一竖排有多少 
sum = 0 

#横排遍历 
for i in range(col): 
    for j in range(row - 3): 
        if content[i][j] == "2" and content[i][j+1] == "0" and content[i][j+2] == "2" and content[i][j+3] == "0": 
           sum +=1 

#竖排遍历 

for i in range(row-3): 
    for j in range(col): 
        if content[i][j] == "2" and content[i+1][j] == "0" and content[i+2][j] == "2" and content[i+3][j] == "0": 
           sum +=1 

#斜向遍历 

for i in range(row-3): 
     for j in range(col-3): 
         if content[i][j]=="2" and content[i+1][j+1]=="0" and content[i+2][j+2]=="2" and content[i+3][j+3]=="0": 
             sum+=1
 print(sum)

 

 

4.跑步锻炼

 

【问题描述】

小蓝每天都锻炼身体。
正常情况下,小蓝每天跑1千米。如果某天是周一或者月初(1日),为了激励自己,小蓝要跑2千米。如果同时是周一或月初,小蓝也是跑2千米。
小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)到2020年10月1日周四(含)。请问这段时间小蓝总共跑步多少千米?

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

sum_ = 0
j = 1
s = 0

month = [0,31,28,31,30,31,30,31,31,30,31,30,31]
a = 2000

while a < 2020:
j = 1
if a%4 == 0:
month[2] = 29


while j<=12:
if (sum_ +6)%7 != 1:
s = s+1

sum_ += month[j]
j = j + 1



if month[2] == 29:
month[2] = 28

a = a + 1

month[2] = 29

b = 1

while b<=9:

if (sum_ +6)%7 != 1:
s = s+1

sum_ += month[b]
b = b+1


sum_+= 1
s +=1

d = (sum_ - 2 + 6) / 7
z = sum_+ s +d
print(int(z))

 

5.单词分析

 

小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。
小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。

【输入格式】
输入一行包含一个单词,单词只由小写英文字母组成。

【输出格式】
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。
如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。

【样例输入】
lanqiao

【样例输出】
a
2

【样例输入】
longlonglongistoolong

【样例输出】
o
6

【评测用例规模与约定】
对于所有的评测用例,输入的单词长度不超过 1000。

 words = input()
 a = []
 for i in words:  //遍历单词
     a.append(words.count(i))  //将单词出现次数放入列表
print(words[a.index(max(a))])     //通过index方法返回查找对象的索引位置
print(max(a))

 

6.数列求值

 

【问题描述】
给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求第 20190324 项的最后 4 位数字。

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写多余的内容将无法得分。

 n = 20190324
 a = [1,1,1]

 for i in range(n-3):
     c = a[i] + a[i+1] + a[i+2]
     a.append(c%10000)   #注意,直接将C添加至列表中,导致运算量过大会导致内存错误报错MemoryError:涉及到了读取、保存、写入,内存不够用了,且后取余五位不会影响结果
 b = str(a[-1])
#此方法为错误的因为到了20190323之后(i+2)将溢出数组故:

N = 20190324
l = [1,1,1]

for i in range(3,20190324):
    x = l[i-1]+l[i-2]+l[i-3]
    l.append(x%10000)
print(l[-1])

 

7.年号字串

 

【问题描述】

小明用字母 A 对应数字 1, B 对应 2,以此类推,用 Z 对应 26。对于 27以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27, AB 对应 28, AZ 对应 52, LQ 对应 329。请问 2019 对应的字符串是什么?

思路:这题考的是进制转换,
直接手算就行了,数据为2019又不大:
如AA:
27%26=1 ->对应A
27//26=1
1%26=1 ->对应A 所以27(10进制)转换为26进制为AA

(329)LQ同理:
329%26=17 ->对应Q
329//26=12
12%26=12 ->对应L,所以329(10进制)转换为26进制为LQ

题目要求的2019同理:
2019%26=17 ->对应Q
2019//26=77
77%26=25 ->对应Y
77//26=2
2%26=2 ->对应B,所以2019(10进制)转26进制为BYQ

 

 

8.数的分解

 

【问题描述】

把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?
注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。

 

两个没注意到的点

  1. 正整数不包括0
  2. 3个不同的数(看题很重要)

所以审题~~~~~~~很重要啊

 

 #思路:2019分解成3个不同的数。为了简化运算,我们把2019分解到 x,y,z三个数中
#不包含2和4,那么通过if判断,将数字转成字符串,然后通过遍历字符串的方式排查2和4
#其中 x最大值为2019 // 3 (673)

count = 0
for x in range(673):
    x = x +1
    for y in range(x+1,1346):
        if '2' not in str(y) and '4' not in str(y) and '2'not in str(x) and '4' not in str(x):
            z = 2019 - x - y

            if z > y and '2' not in str(z) and '4' not in str(z):
               count += 1
print(count)

#2021/4/17 重做一遍后发现有很多细节上的错误,比如第二个循环写成了(675,1265),第三个循环没有判断等等,所以必须得用一些自己可以手算的例子进行判断程序是否正确

 

 

9.等差数列

【问题描述】
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N个整数。
现在给出这N个整数,小明想知道包含这N个整数的最短的等差数列有几项?
【输入格式】
输入的第一行包含一个整数N。
第二行包含N个整数Ai,Ag,… ,Ax。(注意A1~Ax并不一定是按等差数列中的顺序给出)
【输出格式】
输出一个整数表示答案。
【样例输入】
5
2 6 4 10 20
【样例输出】

10
【样例说明】
包含2、6、4、10、20的最短的等差数列是2、4、6、8、10、12、14、16、18、20。

 

思路:1.对数据进行排序,使用列表进行存储

2:前项减后项。记录公差,算出最小公差

3:最大项-最小项+1 = 项数

 n = int(input())
 s = 100000
 demo = list(map(int,input().split())) # map(function, iterable, ...)function -- 函数  iterable -- 一个或多个序列
 demo.sort()
 for i in range(1,len(demo)):
     cha = int(demo[i] - demo[i-1])
     if s > cha:
        s = cha
 count = int(max(demo) - min(demo)/s + 1)
 print(count)

对split方法的补充 :

1、split()函数
语法:str.split(str=””,num=string.count(str))[n]

参数说明:
str:   表示为分隔符,默认为空格,但是不能为空(”)。若字符串中没有分隔符,则把整个字符串作为列表的一个元素
num:表示分割次数。如果存在参数num,则仅分隔成 num+1 个子字符串,并且每一个子字符串可以赋给新的变量
[n]:   表示选取第n个分片

注意:当使用空格作为分隔符时,对于中间为空的项会自动忽略

 >>> u = "www.doiido.com.cn"

#使用默认分隔符
>>> print u.split()
['www.doiido.com.cn']

#以"."为分隔符
>>> print u.split('.')
['www', 'doiido', 'com', 'cn']

#分割0次
>>> print u.split('.',0)
['www.doiido.com.cn']

#分割一次
>>> print u.split('.',1)
['www', 'doiido.com.cn']

#分割两次
>>> print u.split('.',2)
['www', 'doiido', 'com.cn']

#分割两次,并取序列为1的项
>>> print u.split('.',2)[1]
doiido

#分割最多次(实际与不加num参数相同)
>>> print u.split('.',-1)
['www', 'doiido', 'com', 'cn']

#分割两次,并把分割后的三个部分保存到三个文件
>>> u1,u2,u3 = u.split('.',2)
>>> print u1
www
>>> print u2
doiido
>>> print u3
com.cn

 

10.进制转换

问题描述
给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0-9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
输出n行,每行为输入对应的八进制正整数。

【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。

样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。

 

 n = int(input())
 l = []
 for i in range(n):
     if n<=10:
        s = input()
        if len(s) < 100000:
           res_1 = int(s,16) #这里的int(s,16)代表把16进制的S转化成10进制
           res_2 = oct(res_1)#这里的OCT代表把一个整数转化为八进制
           l.append(res_2)
for i in l:
    print(i[2:])#这里的[2:]是代表结果从第三位开始输出



'''本题目可以将输入的16进制数转化为某进制,再将某进制转化为8进制,
于是我在这里拓展一下进制转化的一些方法:
在python中二进制用0b加相应数字来表示,8进制用0o加相应数字来表示,16进制用0x加相应数字来表示。即:
#其他进制转换二进制#
>>> bin(2) #十进制转换二进制#
'0b10'
>>> bin(0o10) #八进制转换二进制#
'0b1000'
>>> bin(0xf) #十六进制转换二进制#
'0b1111'

#其他进制转换为八进制#
>>> oct(0b101)
'0o5'
>>> oct(0xf)
'0o17'
>>> oct(0o123)
'0o123'

#其他进制转换为十六进制#
>>> hex(0o10)
'0x8'
>>> hex(3)
'0x3'
>>> hex(0b111)
'0x7'
'''
'''
#其他进制转换为十进制#
>>> int(0o10)
8
>>> int(0xf)
15
>>> int(0b10)
2
'''
原文链接:https://blog.csdn.net/Harry______/article/details/109142479

 

11.特殊回文数:

 

问题描述
  123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
  输入一行,包含一个正整数n。
输出格式
  按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
  1<=n<=54。
a = int(input())
sum = 0
for i in range(10000,1000000):
    i = str(i)
    if i == i[::i]
       for j in i :
           sum += j
           if a == sum:
               print(i)
           else:
               sum = 0

补充:

print(a[-1]) ###取最后一个元素

[5]

print(a[:-1])  ### 除了最后一个取全部
[ 1 2 3 4 ]

print(a[::-1]) ### 取从后向前(相反)的元素
[ 5 4 3 2 1 ]

print(a[2::-1]) ### 取从下标为2的元素翻转读取
[ 3 2 1 ]

 

12.杨辉三角:

问题描述

杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。

它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。

给出n,输出它的前n行。

输入格式

输入包含一个数n。

输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34。
#前两行的数固定
#取最后一行去计算下一行

 a = int(input())
num = []
nums = [1]
for x in range(a):
    for z in range(x+1):
        if z==0 or z==x:
           num.append(1)
        else:
           num.append(nums[z-1] + nums[z])
   [print(i,end = ' ') for i in num]
   print()
   
   nums = []
   [nums.append(i) for i in num]
   num = []

 

13字母图形

问题描述

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26。
编程过程不难,但是格式对我来说比较难把控
a,b = map(int,input().split())
z = 'A'
for x in range(1,b):
    z = z + chr(65+x)
print(z)
for x in range(1,a+1):
    z = chr(65+x) + z
    z=z[0:b]
print(z)
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
利用format进行格式转化
n = 32
i = 0 
[print("{0:05b}".format(i)) for i in range(n)]

关于format:
相对基本格式化输出采用‘%’的方法,format()功能更强大,该函数把字符串当成一个模板,通过传入的参数进行格式化,并且使用大括号‘{}’作为特殊字符代替‘%’

 

'{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
'{}, {}, {}'.format('a', 'b', 'c')  # 3.1+版本支持
'a, b, c'
'{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
'{2}, {1}, {0}'.format(*'abc')  # 可打乱顺序
'c, b, a'
'{0}{1}{0}'.format('abra', 'cad')  # 可重复
'abracadabra'

14Fibonacci数列

 

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式
输入包含一个整数n。

输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。

说明:在本题中,答案是要求Fn除以10007的余数,因此我们***只要能算出这个余数即可***,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入
10
样例输出
55
样例输入
22
样例输出
7704

数据规模与约定
1 <= n <= 1,000,000

 #此题解题的步骤不难,但是容易出现超时和内存占用过大,必须简化算法
n = int(input())
res1, res2 = 1, 1 
for i in range(3, n+1): 
     res1, res2 = res2 % 10007, (res1 + res2) % 10007 #res1=res2%10007 res2=(res1+res2)%10007
print(res2)

同样同种类型题:

问题描述
求1+2+3+…+n的值。
输入格式
输入包括一个整数n。
输出格式
输出一行,包括一个整数,表示1+2+3+…+n的值。
如果使用暴力解题是容易超时的,所以得另想办法
n = int(input())
sum = int(n*(n+1)/2)  #使用数列求和的办法
print(sum)
补充知识:

统计 python 列表中每种相同元素出现的次数:

import collections
lst = ['Albatross', 'Albatross', 'Yellow_breasted_Chat', 'Albatross', 'Yellow_breasted_Chat', 'Yellow_breasted_Chat',
'Cuckoo', 'Cuckoo', 'Cuckoo', 'Cuckoo']
dic = collections.Counter(lst)
# Counter({'Cuckoo': 4, 'Albatross': 3, 'Yellow_breasted_Chat': 3})
print(dic)
for key in dic:
print(key, dic[key]) # key是元素,dic[key]是元素出现的次数

15.日志统计

小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有N行。其中每一行的格式是:
ts id
表示在ts时刻编号id的帖子收到一个”赞”。
现在小明想统计有哪些帖子曾经是”热帖”。如果一个帖子曾在任意一个长度为D的时间段内收到不少于K个赞,小明就认为这个帖子曾是”热帖”。
具体来说,如果存在某个时刻T满足该帖在[T, T+D)这段时间内(注意是左闭右开区间)收到不少于K个赞,该帖就曾是”热帖”。

 

给定日志,请你帮助小明统计出所有曾是”热帖”的帖子编号。

【输入格式】
第一行包含三个整数N、D和K。
以下N行每行一条日志,包含两个整数ts和id。

对于50%的数据,1 <= K <= N <= 1000
对于100%的数据,1 <= K <= N <= 100000 0 <= ts <= 100000 0 <= id <= 100000

【输出格式】
按从小到大的顺序输出热帖id。每个id一行。

【输入样例】
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3

【输出样例】
1
3

资源约定:
峰值内存消耗(含虚拟机) < 256M

CPU消耗  < 1000ms

 

方法是“尺取法”     尺取法:顾名思义,像尺子一样取一段,借用挑战书上面的话说,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。尺取法比直接暴力枚举区间效率高很多,尤其是数据量大的时候,所以说尺取法是一种高效的枚举区间的方法,是一种技巧,一般用于求取有一定限制的区间个数或最短的区间等等。当然任何技巧都存在其不足的地方,有些情况下尺取法不可行,无法得出正确答案,所以要先判断是否可以使用尺取法再进行计算。

 

N,D,K = map(int,input().split())
a = {}
for i in range(N):
    ts,id = map(int,input().split()
    if id not in a:
        a[id] = {}
    q = (ts//10)*10 #取整数,再乘回来,可以得到区间,比较核心
    m = (q,q+D)
    if m not in a[id]:
       a[id][m]=1
    else:
       a[id][m] +=1

#print(a)

res = []
for key,value in a.items(): #遍历字典,,背~~
    for inkey in value.values():
         if inkey>=K:
             res.append(key)

for i in range(len(res)):
print(res[i])



 

16 .日期问题

问题描述:
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入格式:
一个日期,格式是”AA/BB/CC”。 (0 <= A, B, C <= 9)
输出格式:
输出若干个不相同的日期,每个日期一行,格式是”yyyy-MM-dd”。多个日期按从早到晚排列。
样例输入
02/03/04
***样例输出 ***
2002-03-04
2004-02-03
2004-03-02

a,b,c = map(str ,input().split("/"))
month = [1,3,5,7,8,10,12]
month_one = [4,6,9,11]
#1.闰年2月 2.大小月 
def years(x):
    if x%4 ==0 and x%100 == 0 or x%400 ==0:
       return True
def year(y): 
   if y>=60 and y<=99:
      y =y+1900
   if 0<=y<=59:
      y = y+2000
        return y

gg = year(int(a))  #判断年份在哪个地方
gg_c = year(int(c))

#如果是闰年
if years(gg) and 1<=int(b)<=12:
      if int(b) in month:
          if int(c)<=31:
             print(str(gg)+'-'+b +'-'+c)
      elif int(b) in month_one:
          if int(c)<=30:
             print(str(gg)+'-'+b +'-'+c)
      else:
          if int(c)<=29:
             print(str(gg)+'-'+b +'-'+c)
#若不是
else:
      if int(b) in month:
          if int(c)<=31:
              print(str(gg)+'-'+b +'-'+c)
elif int(b) in month_one:
          if int(c)<=30:
              print(str(gg)+'-'+b +'-'+c)
          else:
              if int(c)<=28 and 1<=int(b)<=12:
              print(str(gg)+'-'+b +'-'+c)

同理对其他两种情况,因为没有优化代码,所以太垃圾了,接下来只需对相应的A,B,C改动就行了


 

17.生日蜡烛

【问题描述】:某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了236根蜡烛。请问,他从多少岁开始过生日party的?请填写他开始过生日party的年龄数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

 #方法一:暴力枚举,由题可看出是等差数列,但是不知道首项和An
for i in range(100):
    for j in range(100):
        if((i+j)*(j-i+1)/2 == 236):#(首项+末项)/2*项数
print(i,j-i+1)

#方法二:求和公式na1 + n(n-1)*d/2 通过先求出n(n-1)/2 在和236相减相除得到一个整
#数以保证数据合理
for i in range(1,100):
    t = i*(i-1)/2
    x = (236-t)%i
    if(x == 0):
       print((236-t)/i)

 

18.移动距离:

移动距离

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3…
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:

1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 …..

我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)

输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。
要求输出一个整数,表示m n 两楼间最短移动距离。

例如:
用户输入:
6 8 2
则,程序应该输出:
4

再例如:
用户输入:
4 7 20
则,程序应该输出:
5

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

#根据样例可以发现,从横或者从竖着数移动距离都是一样的

w,m,n = map(int,input().split())
#算出从1到m,n共经历多少行
hamg_m = 0
hang_n = 0

if m%w ==0:
   hang_m = m/w
else:
   hang_m = m//w+1
if n%w ==0:
   hang_n = n/w
else:
   hang_n = n//w+1

#算出从1到m,n共经历多少列

lie_m = 0
lie_n = 0
if(hang_m%2 == 0):
    lie_m = w*hang_m-m+1
else:
    lie_m = w-(w*hang_m-m)
if(hang_n%2 == 0):
    lie_n = w*hang_n-n+1
else:
    lie_n = w-(w*hang_n-n)

#print(hang_m,lie_m,hang_n,lie_n)
print(int(abs(hang_n-hang_m)+abs(lie_n-lie_m)))

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇