1.天干地支(填空题)
题目描述
古代中国使用天干地支来记录当前的年份。
天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。
地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、 亥(hài)。
将天干和地支连起来,就组成了一个天干地支的年份,例如:甲子。
20202020 年是庚子年。
每过一年,天干和地支都会移动到下一个。例如 20212021 年是辛丑年。
每过 6060 年,天干会循环 66 轮,地支会循环 55 轮,所以天干地支纪年每 6060 年轮回一次。例如 19001900 年,19601960 年,20202020 年都是庚子年。
给定一个公元纪年的年份,请输出这一年的天干地支年份。
问题分析:考察取余 将下标和天干(地支)对应起来
用一个列表存起来 由于数组的下标是从0开始,这里对应起来可能会卡住一下
解决办法:以天干(下标从0到9)为例子,比如输入n=2027,由于一开始2020对应的下标是6(gengzi),经过7年后,数一下,会发现,2027对应的下标应该是3,
如果直接(7)%9会发现等于2 不符合我们的预期。
想到了一个办法,把下标0—9看作1—10,因而只需要(#变化的年数)%10-1即可
细节的地方:
变化的年数是负数怎么办?即导致下标是负数怎么办?
emm可以找几个比2020小的试一下,能过就放上去。(因为数学规律通常是简洁的,不会想得那么复杂!!)
AC代码:
a=['jia', 'yi', 'bing', 'ding', 'wu', 'ji', 'geng', 'xin', 'ren', 'gui'] b=['zi', 'chou', 'yin', 'mao', 'chen', 'si', 'wu', 'wei', 'shen', 'you', 'xu', 'hai'] n=int(input()) print(a[(7+n-2020)%10-1]+b[(1+n-2020)%12-1])
2.求值(填空题)
这道题和【蓝桥杯国赛真题】备战24天 Python_Py小郑的博客-CSDN博客
我之前写的文章里面的:阶乘约数 道理差不多
对于这道题我的思考过程是,第一步肯定想到暴力枚举,但是由于暴力枚举的上限关系到数组m的大小,m[i]表示质数i出现的次数,(i如果是偶数,我们初始化为1了,至于为什么在上面那个博客里面那道题详细说了),当上限很大的时候,m往往过大,时间过长,方法不合适。 但是有了先前那道题的经验,已经有了100以内的任意数字其的约数个数,把他们打印出来,即执行下面这段语句,观察一下,发现如果取两个数字,他们互质的话,那么,
for i in range(1,101):
print(i,find(i))
#find(i)在下面有说
他们的乘积对应的约数个数就是两个数字约数个数的乘积。
因而,有了1-100对应的约数,我们可以进行迭代,详细点说:
创建一个数组p=[] ,p的每个元素以列表出现,每个列表有两个数字,分别存特定数字和特定数字对应的约数个数,即比如p=[[2,2],[7,2]],可以获知2的约数有两个,7的约数有两个,由于2和7互质,那么可以迭代生成[14,4]
由于迭代多次不大可能实现,观察经过第一次迭代,发现已经有符合条件的(刚好是答案45360),那么只需要在(1,45260)验证即可,这是我的思路:做题经验+观察+猜测验证
因为是填空题嘛hh,结果发现在(1,45360)只有45360这一个数,那么就是他了
AC代码
#把n分解为多个质数乘机(a1+1)(a2+1)..(an+1)==100退出 def find(n): s=1 m=[1]*101#m[i]:质数i被分解的个数 j=2 while j<=n: if n%j==0: m[j]+=1 n//=j else: j+=1 for i in m: s*=i return s#返回约数个数 p=[] for i in range(1,101): if find(i)%5==0 or find(i)%2==0: p.append([i,find(i)]) def gcd(a,b): while b: a,b=b,a%b return a for i in range(1,len(p)): if gcd(p[i][0],p[i-1][0])==1: key=p[i][0]*p[i-1][0] val=p[i][1]*p[i-1][1] if [key,val] not in p: p.append([key,val]) St=float('inf')#St for i in range(len(p)): for j in range(i+1,len(p)): if gcd(p[i][0],p[j][0])==1: if p[i][1]*p[j][1]==100: St=min(St,p[i][0]*p[j][0]) print(p[i],p[j])