基础练习
非VIP试题
-
A+B问题
![](https://img-blog.csdnimg.cn/img_convert/0ae1202ae33e705c4ae29f79b3db0981.png)
a,b=map(int,input().split())#map函数,空格分隔
print(a+b)
知识点1:map函数:map(function, iterable, ...) 是python的内置函数,不了解的可以去菜鸟教程看看
题目中int是函数,且int在function的位置意思是把后面输入的字符转换为整数形式
def square(x): #计算平方数
return x**2
map(square,[1,2,3])
-
数列排序
![](https://img-blog.csdnimg.cn/img_convert/18e045ce2b6e3f7aae2b9716867bb18b.png)
n=int(input())
s=list(map(int,input().split()))
s.sort()
for i in range(n):
print(s[i],end='')
其实这道题没什么好说的,看到这的友友们去复习一下python的range函数!
注意range里要是数字的话,取不到最后一个数!
range也可以以列表为范围
还有就是列表排序用list.sort()
-
十六进制转八进制
![](https://img-blog.csdnimg.cn/img_convert/1e9bb08e34b6a09ce96a26b11aaa5ed9.png)
n=int(input())
s=[]
for i in range(n):
s.append(int(input(),base=16))
for j in s:
print(oct(j)[2:])
知识点1:n是用来做行数去循环的
知识点2:十六进制转十进制是用int函数后加base(后加进制数) 任何进制转十进制都是如此
知识点3:需要去掉转制后的前缀,用到列表切片
hex是十进制转十六进制
oct是十进制转八进制
bin是十进制转二进制
-
十六进制转十进制
![](https://img-blog.csdnimg.cn/img_convert/5749edb1fb1d1c88d510a2fd0699fc6e.png)
print(int(input(),base=16))
-
十进制转十六进制
![](https://img-blog.csdnimg.cn/img_convert/316f2586c3e6e51d3b9d747e50dc5836.png)
n=int(input())
print(hex(n)[2:].upper())
知识点 :十进制转十六进制,十六进制中的字母须大写
-
特殊回文数(题目没截全,要求是回文数且是五位和六位,回文数不懂的可以去搜搜 这里就不加赘述了)
![](https://img-blog.csdnimg.cn/img_convert/4b5152ee4f1303ac92b96657c9dd382a.png)
n=int(input())
s=[]
for i in range(1,10):
for j in range(10):
for k in range(10):
if(2*i+2*j+2*k==n):
s.append(10**5*i+10**4*j+10**3*k+10**2*k+10*j+i)
if k==0:
s.append(10**4*i+10**3*j+10**2*k+10*j+i)
elif(2*i+2*j+k==n):
s.append(10**4*i+10**3*j+10**2*k+10*j+i)
for m in sorted(s):
print(m)
知识点1:基本思路是五位的情况:条件2*i+2*j+k==n,输出的回文数是10**4*i+10**3*j+10**2*k+10*j+i,六位的同理,最好自己思考一下,再去看代码
需要注意的是当k=0,n为36时(为什么会考虑到36,因为i,j=9,k=0是特殊情况),会出现五位时,2*9+2*9+0=36,但六位时2*9+2*9+2*0=36,如果不单独考虑这种情况,在代码第十行的if条件中,99099就会被忽略掉,所以要在六位数的if语句下,加考虑k=0的if条件语句,且结果是k=0为五位数的情况(99099)加在里面,99099就不会被忽略掉
注意:还要注意是从小到大的顺序
错误点
-
用的是elif
-
a+b==n要用比较运算符==
-
回文数(很经典的问题,是俺在学校学python遇到第一个有难度的)
![](https://img-blog.csdnimg.cn/img_convert/64dd7f1e75f68ad1dca102d8ba2d2c2f.png)
s=[]
for i in range(1,10):
for j in range (10):
s.append(10**3*i+10**2*j+10*j+i)
for m in sorted(s):
print(m)
仍需注意从小到大的顺序问题
-
特殊的数字
![](https://img-blog.csdnimg.cn/img_convert/d9f40d25b921b0355974e6f4cf2b9661.png)
s=[]
for i in range (1,10):
for j in range(10):
for k in range(10):
if (i**3+j**3+k**3==10**2*i+10*j+k):
s.append(i**3+j**3+k**3)
for m in sorted(s):
print(m)
(不搞花里胡哨的了hhhh,直接在题下写解析)
此题最重要的地方就是这个特殊的数字,它是由它的立方和组成的,如题中给的例子153=1*1*1+5*5*5+3*3*3,在代码中体现为i**3+j**3+k**3==10**2*i+10*j+k
仍需注意从小到大排序
气死了!!!!!笨人忘记缩进了,顺便提醒大家,比赛时一定要检查好缩进和:
-
杨辉三角(笨人我研究了两天!终于搞明白了,接下来看俺讲给大家听
![](https://img-blog.csdnimg.cn/img_convert/367b19fb9febe07ec64ae8d88559eccd.png)
![](https://img-blog.csdnimg.cn/img_convert/842ada6c98128003e90aa5a52e329999.png)
这道题我了解到有三种解法,先copy一下我觉得最容易理解的一种(此代码的出处
i = [[0,1,0],[0,1,1,0]] # 建立前两行
n = int(input())# 输入行数
for p in range(2,n):#控制行数,从第三行开始算
o = i[-1] #获得上一行的数据
u = [] #储存下一行数据
for v in range(len(o)-1):#进行计算
u.append(o[v]+o[v+1])#根据性质:三角形中的每个数字等于它两肩上的数字相加
u.insert(0,0)#在最前面插入0 方便计算下一行的第一项的1
u.append(0)#在尾部加入0 方便计算下一行的最后一项的1
i.append(u)#将新的行的数据储存进i内
for list_ in i:#抽出每一行进行打印
for q in list_[1:-1]:#抽出每个数据 用切片把第一个零和最后一个0隔开
print(q,end = ' ')#打印每一个数据 末尾用空格
print()#换行
思路很容易理解,而且注释也很详细了
还有一种我没太想到的思路(代码出处是上面的链接
n=int(input())
nums=[[0]*n for i in range(n)]#初始化一个n*n的零阵
for i in range(n):
for j in range(n):
if j==0:
nums[i][j]=1
else:
nums[i][j]=nums[i-1][j-1]+nums[i-1][j]
if nums[i][j]!=0:
print(nums[i][j],end=' ')
print()
这里nums[0][0]是指在初始化的零阵中,某数字的位置,第一行的第一个数,那么在杨辉三角中,nums[0][0]=1,然后开始双循环,第一个for是控制行数,第二个是控制一行中的数字,因为杨辉三角第一行(i=0)第一个数(j=0)是1,所以有了if语句
杨辉三角的本质是每一个数等于他肩上的两个数之和( nums[i][j]=nums[i-1][j-1]+nums[i-1][j]),基本到这就结束了,然后就是输出,最后一行的print()是换行(该print的位置是第一个换行for循环下的,注意好缩进)
刚开始的初始化一个n*n的零阵也值得记一下(他是如何定义零阵的)反正笨人我是没想到,这道题也是关于二维数组这个知识点的应用,带大家学习一下
错误点
-
初始化一个零阵(二维数组)
-
阵的使用方法s[1][2],中括号里表示的是对应的位置,如s[1][2]是表示在阵中第一行第二列的数是多少
二维数组
知识点的出处
我就简单概括一下s(某列表)[行号][列号]=(数字)
![](https://img-blog.csdnimg.cn/img_convert/52c1f6b935c733b6bb9f99f6dc8f0054.png)
-
查找整数
![](https://img-blog.csdnimg.cn/img_convert/a766ca5c942d24c16532658938399310.png)
![](https://img-blog.csdnimg.cn/img_convert/88cf3acfdc2f1a2dbca2af221dc366a7.png)
n=int(input())
nums=list(map(int,input().split()))
a=int(input())
count=0#引入计数器
for i in range(len(nums)):
if a==nums[i]:
print(i+1)#位置从1开始编号
count+=1
break
if count==0:
print(-1)
此代码出处为
1:计数器的引入,如果不加计数器的话,是if i==len(nums)-1: 然后print(-1)没有考虑到列表长度为1的情况,
2:break语句大家复习一下
笨人我此题的错误点nums=list(map(int,input().split())),split用法错误,我放在map的外面了!大家也注意一下
-
数列特征
![](https://img-blog.csdnimg.cn/img_convert/8f2ff082a9491eed4e3ac0e721f1b202.png)
n=int(input())
s=list(map(int,input().split()))
print(max(s))
print(min(s))
sum=0
for i in s:
sum+=i
print(sum)
这道题还是比较简单的 总结:找最大数用max()函数,最小用min()函数
求列表里数字的和就用sum搭配for循环
然后让输出一串数字,并且题目是围绕这一串数字展开的就用s=list(map(int,input().split()))
-
字母图形
![](https://img-blog.csdnimg.cn/img_convert/f932acf5bde7e4be630aea4cc06d6455.png)
![](https://img-blog.csdnimg.cn/img_convert/1cba4dbbc57803839b77c86052f3328d.png)
n,m=map(int,input().split())
for i in range(n):
for j in range(m):
print(chr(65+abs(i-j)),end='')
print()
这个解法是我找到的最简单的一种方法,涉及到chr()函数是输入一个整数[0,255]返回其对应的ascii符号,那与之作用相反的函数是ord(),返回的是单个字符的ASCII值
abs()是python的内置函数,作用是返回为绝对值
仍需注意换行print()是在第一个循环下的
解法和知识点讲解来自
-
01字串
![](https://img-blog.csdnimg.cn/img_convert/eafbf179645b49849465f6b3ebd28678.png)
![](https://img-blog.csdnimg.cn/img_convert/c2d1e444203fdb1132b2835914ecf2cb.png)
for i in range(32):
print('%05d'%int(str(bin(i))[2:]))
这道题就是python的细知识点了
%d是指格式化整数,%nd是输出整数的宽度至少是n位且右对齐,%05d是指表示输出的整数宽度为5且用0补足
-
闰年判断
![](https://img-blog.csdnimg.cn/img_convert/ece21e680a3f7692effc08831fc946fb.png)
![](https://img-blog.csdnimg.cn/img_convert/51f1e7214099e47d5faac875f6969785.png)
n=int(input())
if (n%4==0 and n!=100) or n%400==0:
print('yes')
else:
print('no')
这道题就是一个简单if语句,但是闰年的特征最好记住,可能竞赛或考试不会给你这个特征!
-
Fibonacci数列
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
![](https://img-blog.csdnimg.cn/img_convert/33fc1be904e92421a10514f80ea63231.png)
找到个详细无比的解析,真的很详细了,笨人我都能看懂
n=int(input())
F=[1,1]
if n<=2:#减小运行内存
for i in range(n):
F.append(F[i]+F[i+1])
print(F[n-1]%10007)
else:
for i in range(n-2):
result=(F[1]+F[0])%10007 #加快运行时间
F[0],F[1]=F[1],result #运算往下迭代运行
print(result)
-
圆的面积
![](https://img-blog.csdnimg.cn/img_convert/d6934441faa5a9b5761e08fa38be8cb6.png)
![](https://img-blog.csdnimg.cn/img_convert/e941e3d6fcc31aae90b6ec3832127599.png)
import math
n=int(input())
s=math.pi*n**2
print('%.7f'%s)
这道题需要注意的是 import
![](https://img-blog.csdnimg.cn/img_convert/8d6f2e7f68caf9f1fed98496bbefe192.png)
且使用pi时,要在其前面加上math.
-
序列求和
![](https://img-blog.csdnimg.cn/img_convert/43256f633a720c775183175cc5aecd63.png)
n=int(input())
sum=0.5*n**2+0.5*n
print(int(sum))
这道题没有用for循环是因为,运行时间超时了,用数学思维去考虑这道题的话,就用等差求和
注意sum输出时要加上int
VIP试题
-
阶乘计算
![](https://img-blog.csdnimg.cn/img_convert/d2ea4ac44df0f290ef6bc8a9026eb1d3.png)
![](https://img-blog.csdnimg.cn/img_convert/ef965b170d3b41fd5da22ef726b661c7.png)
n=int(input())
a=1
for i in range(1,n+1):
a*=i
print(a)
当我看到它的算法要求我就懵了,但是我自己做的时候忽略了这条,正常拿for循环,但是是满分
但是考虑到这道题考察到数组,还是去找找数组做的方法
![](https://img-blog.csdnimg.cn/img_convert/278588f217f48b37d846b904f3f432ec.png)
求一个看懂这个的大佬555
-
高精度加法
![](https://img-blog.csdnimg.cn/img_convert/6a031c81705d5f3d0eb6e3e4ab492de0.png)
![](https://img-blog.csdnimg.cn/img_convert/3743e07d84f9a295b030ee9d9cbe7a93.png)
因为python支持高精度
a=int(input())
b=int(input())
print(a+b)
用算法描述中的思路找到了这种方法
a=list(input())
b=list(input())
l=abs(len(a)-len(b))
for i in range(l):
if len(a)>len(b):
b.insert(0,0)
else:
a.insert(0,0)
c=[]
r=0
for x,y in zip(a[::-1],b[::-1]):
s=int(x)+int(y)+r
if s>=10:
r=s//10#//是去商
else:
r=0
c.insert(0,str(s%10))#%是取余数
c.insert(0,str(r))
print(int(''.join(c)))
整体思路:
把两位数相加 用手写的方式表达
1.补零 有时两个数的位数不一定相等,但是算数的话都是从个位数(也就是列表的最后一位数开始算),所有需要用0把位数补齐,例如a列表的长度(a数字的位数)大于b列表,就在b列表的0的位置加0(insert函数),直到len(a)=len(b),也就是两个数位数相等,那么就可以开始进行运算了
![](https://img-blog.csdnimg.cn/img_convert/2313119cb9ced72296859979bbdabfdc.png)
2.开始算数:两个数一个数一个循环(本题中用了zip函数,可两个数同时循环),从最后一位开始(列表中的-1位置)
第一次循环:两个列表的最后一位相加,会出现两种情况
一种是图中的9+0,没满十的情况(就例子来讲,另一种情况下面会解释的
s=9+0=9,r=0,c.insert(0,9)
18行的代码是在for循环外的,也就是说for循环结束,才会用到这行代码
第二次循环:跟第一次循环一样,最后是c.insert(0,8)
第三次循环:是上面提到的第二种情况,s=9+1=10(满十了,需要进位),r=10//10=1,c.insert(0,0)
剩余循环就和上面的循环相似了
到了18行代码,其实是用来在最前面的一位,加1的,看最后一次循环,也就是4+9那次,这次循环的结果仅是得出c.insert(0,3)的,等到18行代码时,会加上r(此时r=1),到此算数完成,下面就可以输出喽
3.输出:因为输入的时候把数字转成了列表,那么输出的时候需要把得到的列表转回数字(用int函数的原因)int()参数必须是字符串、对象或数字之类的字节,而不是“list”.
join函数 三个小时才彻底弄懂一道题,想紫砂