前言
废话不多说,上篇博客也规划明白了,直接开刷。
1、等差素数列
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
2,3,5,7,11,13,… 是素数序列。 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为 30,长度为 6。
2004 年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:长度为 10 的等差素数列,其公差最小值是多少?
下面是暴力解法
import math
def sushu(x):
for i in range(2,int(math.sqrt(x))+1)://判断是否是素数,在【2,根号x}范围内查找
if x%i==0:
return False
return True
pd=True
for i in range(2,10000)://暴力就是得扩大范围
if sushu(i) and pd==True:
for k in range(1,500):
a=[0]*10
a[0]=i
for j in range(9):
if sushu(a[j]+k):
a[j+1]=a[j]+k
else:
break
if 0 not in a:
pd=False//标志循环结束
print(k)
当然如果你之前上过奥数班的话,这题一眼出结果
2004年,格林和陶哲轩证明存在任意长的素数等差数列。2004年4月18日,两人宣布:他们证明了“存在任意长度的素数等差数列”,也就是说,对于任意值K,存在K个成等差级数的素数。例如 K=3,有素数序列3, 5, 7 (每两个差2)……K=10,有素数序列 199, 409, 619, 829, 1039, 1249, 1459, 1669, 1879, 2089 (每两个差210)。对于长度为k的素数等差数列,它们的公差能被小于k的所有素数整除。他们将长达50页的论文——《素数含有任意长度的等差数列》——张贴在当日的预印本网站上,并向《美国数学年鉴》(Annals of Mathematics)投稿。
对于长度为k的素数等差数列,它们的公差能被小于k的所有素数整除。 这句话的意思是,假设长度为10,公差就等于所有小于10的素数的积。本题答案也就是 2 * 3 * 5 * 7=210
由此可见少儿教育多么重要,如果你没有ac过,请让你的孩子未来有资格ac。
2、后缀表达式
N,M=map(int,input().split())
lst=list(map(int,input().split()))
b=sorted(lst)
if M!=0:
res=b[-1]-b[0]
for i in range(1,M+N+1-1):
res+=abs(b[i])
else:
res=0
for i in range(M+N+1):
res+=b[i]
print(res)
首先,后缀表达式可以表示成二叉树的形式。
本题的突破口是负号的变号特性,负号可以把正号变成负号,把负号变成正号。
因此虽然给了N个正号和M个负号,但其实可以凑出1到N+M个负号。
因此一定会减去一个数,而且因为第一个数前面没有符号,还要再加一个数。因此只要减去最小的数,再加上最大的数,剩下的数直接用绝对值进行求和即可。
3、九宫幻方
from itertools import permutations//使用枚举工具
m=[]//矩阵
s=[1,2,3,4,5,6,7,8,9]
for i in range(3)://分三次接收数据
m.extend(map(int,input().split()))
ans=0
for p in permutations(s)://枚举数组的所有排列
flag=True
for i in range(9):
if m[i]!=0://当找到符合的排列时,进行验证操作
if m[i]!=p[i]: flag=False
if flag==True and p[0]+p[1]+p[2]==p[3]+p[4]+p[5]==p[6]+p[7]+p[8]==p[0]+p[3]+p[6]==p[1]+p[4]+p[7]==p[2]+p[5]+p[8]==p[0]+p[4]+p[8]==p[2]+p[4]+p[6]==15:
ans+=1
if ans==1: res=p//保留第一个符合条件的矩阵
if ans==1://只有一个解说明符合条件,输出矩阵
for i in range(3):
print(' '.join(str(j) for j in res[3*i:3*i+3]))
else:
print("Too Many")
4、
s=0
da='''string'''
a=da.split('\n')
for i in range(30):
for j in range(50):
for k in range(j,50):
if ord(a[i][j])<ord(a[i][k])://右边
s+=1
for k in range(i,30):
if ord(a[i][j])<ord(a[k][j])://下边
s+=1
for u in range(30):
for v in range(50):
if (u-i+v-j==0 and u!=i) or (u-i==v-j and u-i>0)://正反对角线
if ord(a[i][j])<ord(a[u][v]):
s+=1
print(s)
这题手算不显示,读好题目,暴力AC
5、跳跃
n,m=map(int,input().split())
dp=[[*map(int,input().split())] for _ in range(n)]
direct=[(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(2,0),(2,1),(3,0)]//每步可以走的范围
for x in range(n):
for y in range(m):
res=[]
for dx,dy in direct://遍历每个点能走的位置
lx=x-dx
ly=y-dy
if(lx>=0 and ly>=0 and lx<n and ly<m):
res.append(dp[lx][ly])//加到可行走范围内
dp[x][y]+=max(res) if len(res)!=0 else 0//通过max()算出这个位置最大的奖励值
print(dp[-1][-1])//此位置为原点最大奖励值
终于遇到一个动态规划,简单说你从原点向前思考,分支太多,但是你从终点倒推,就会看到一条康庄大道
6、饮料换购
n=eval(input())
s=n
while n>=3:
n-=3
n+=1
s+=1
print(s)
花三瓶,赚一瓶,不用着急一步一步算
7、平行四边形面积
l=int(input())
h=int(input())
s=l*h
if type(l*h) is int:
print(l*h)
else:
print(f"{
s:.1f}")
要记住print小数咋写
8、猜生日
res=[]
for y in range(1900,2013):
for d in range(1,31):
num=y*10000+6*100+d
if num%2012==0 and num%3==0 and num%12==0:
res.append(num)
break
print(res)
一开始读题给我读蒙了,整除的意思是分别整除,暴力冲一下吧
结语
今天从下午开始写,到晚上9点整结束,刷了16道题,有一些肉眼能看出来的就不放在blog上面了,第一天确实还是有点疲惫,可能上午6道,下午6道,晚上6道效果更好一点,也要兼顾难度,比如5简单+1中等,困难的话我不建议现在刷,打卡第一天!