Python刷OJ(online Judge)

如果您是一名浙江2020级及以后的高中生要学习Python,抑或是一位科学工作者要学习Python,抑或是一名熟悉C/C++想扩展自己的技术栈来学习Python,抑或是一位小朋友在学习Python,以下文章对您学习Python语言熟练Python将非常有帮助。
这里以天天快乐编程TZOJ为例,带您一起尝试用Python刷OJ,提升自己的编程技巧及解决问题的能力。天天快乐编程信息技术分类,以下题目已按顺序在分类里。

一、Python是什么

Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,也就是龟叔,顺便一提,Van 这个姓氏代表是贵族后裔。

Python提供了高效的高级数据结构,还能简单有效地面向对象编程。别人帮你造好了大楼,你拿来用就可以了。Python是面向对象的语言,是一种抽象的软件开发的思想方法,在Python里一切皆对象。
Python是解释型语言,他会将将源代码逐条转换成目标代码同时逐条运行。而C/C++等编译型语言会一次性将代码转换为目标代码,所以运行速度更快。最广泛使用的Python解释器是CPython,其是用C语言实现的Python解释器。Python语法很多来自C,但是其有其又增添了一些语法规则,如强制缩进。
Python可以花更多的时间用于思考程序的逻辑,而不是具体的实现细节,所以受科研工作者深度热爱。Python简单易学,所以作为非计算机专业学生的入门语言也是非常友好的,不用担心学不会。Python具有非常丰富的模块,它可以帮助你处理各种工作。比如OCR识别,一行代码,如pytesseract.image_to_string("sample.jpg"),即可完成对"sample.jpg"这个图像文件的文字识别。使用几行代码也能完成对表格的复杂处理。当然他的功能远不如此,图形界面开发、系统网络运维、科学与数字计算均可用Python轻松完成。那如果你是计算机专业,我的建议还是从C学起,老老实实将数据与算法学踏实,这对你学习Python也会非常有帮助。无论学习什么语言,算法都是程序设计的核心。
Python取各语言之长,前面我们已经提到过其语法很多来自于C,其标准库的正则表达式参考了Perl,而lambda, map, filter, reduce等函数参考了Lisp。

二、顺序结构

1.给世界打招呼

1452: C语言实验题――Hello World要求我们打个招呼,这句话也是学习每个语言的开始。我们想要让程序显示内容,需要使用对应的语句,其对应的就是我们的输出语句print("你要说的内容"),我们将你要说的内容换为你要说的话即可,中英文均可。
1452参考代码

print("Hello, World!")

print函数格式:print(*objects,sep=' ',end='\n')
功能:可以一次输出多个对象。多个参数(object复数)之间用逗号分割,输出的多个对象之间的分隔符默认为一个空格,所有信息输出之后添加的符号默认为换行符。

然后你可以划到页面底部,点击提交按钮,然后将运行语言选择为Python3,并将你的代码粘贴进去,点击提交后即可看到结果。

提交后显示红色的Accepted代表你通过了这个题目,绿色的Wrong Answer代表你写错了,蓝色的Compile Error代表你没有将语言改为Python3。
通过后你可以尝试下一下这几个题目6176 5980 5605
那如果要多打几次,比如5221: 重要的话说三遍,要求我们将I'm gonna WIN!说三遍,聪明的你可以尝试一下。

参考代码
print("I'm gonna WIN!")
print("I'm gonna WIN!")
print("I'm gonna WIN!")
我们将代码复制三遍就可以了,为什么全写在""内不可以呢,因为你需要换行,这个可以参考下面代码,\n表示换行,print默认输出之后添加的符号默认为换行符,之后我们还会介绍换行
参考代码
print("I'm gonna WIN!\nI'm gonna WIN!\nI'm gonna WIN!")

练习: 6762

2.给自己打个招呼

5600: 打招呼要求我们给定一个名字,然后给他打个招呼。输出我们可以用print,那么输入我们怎么做呢,可以使用input()语句。输出空格需要我们控制,我们可以使用sep控制
5600参考代码

# 用name保存输入内容
name = input()
print("Hello, ",name,"!",sep='')

input函数格式:input([prompt])
功能:读取从键盘输入的字符串,若给定提示字符串(参数prompt),则直接输出。
注释
注释主用于解释程序代码,目的是提升代码的可读性。在Python程序中,单行注释以“#”开头。注释部分分会被编译器略去,从而不被计算机执行。

变量是指其值在程序执行过程中会发生变化的量,它一般需要先定义在使用,比如上面我定义了name变量将输入的名字保存了下来。

赋值语句
赋值语句是最基本的语句,它的作用就是将表达式的值赋给变量。
格式:变量名=表达式。其中“=”为赋值号
功能:把赋值号右边表达式的计算结果,存储到赋值号左边的指定的变量中。

在Python中,给变量明明,要遵循以下规则:
1)只能包含字母、数字和下划线。注意字母区分大小写。注:Python3支持中文变量名
2)不能以数字开头,不能与关键字同名。

练习:5681
本题需要读入多个元素,设置多个变量依次读入依次输出即可。

参考代码
name = input()
age = input()
NO = input()
print("name:",name,sep='')
print("age:",age,sep='')
print("NO:",NO,sep='')

3.计算a+b

1001: 整数求和给我们两个数字,要让我们对他们进行求和。
如果我们读入后直接将a+b,他会输出两个数字相连接,比如1和2,会输出12。那么如何让其输出3呢。数据具有不同的类型,不同的类型也对应不同的特征,input得到的类型为字符串类型。
Python的常用数据类型

数据类型名称 数据表示形式
整形(int) 数学中的整数,如0,1,-2等
浮点型(float) 数学中的小数,如2.0,3.14,-6.8等
字符串型(str) 用引号作为定界符,如'ABC',"请输入"等
列表(list) 用方括号作为定界符,如[1,2,3],[1,'a']等
布尔型(bool) 只有两种值:True和False

本题我们要计算两个整数的和,我们可以用int()将其转换为对应的类型。

Python常用的数据类型转换函数
int([x]):将字符串或者数字转换为整数。
float([x]):将字符串或数字转换为浮点数。
例如: >>> float("25")
      25.0

1001参考代码

a=input()
b=input()
print(int(a)+int(b))

练习:6442 6783 5974

4.复杂数字计算

除了可以算加减外,四则运算的乘除也是支持,乘号用的是"*",位于数字8的上方,除号用的是"/",位于右shift的左侧。
Python常用算数运算符

运算符 表达式 描述 示例 优先级
+ x+y 将x与y相加 5+2结果为7 3
- x-y 将x减去y 5-2结果为3 3
* x*y 将x与y相乘 5*2结果为10 2
/ x/y 将x除以y,结果为浮点数 5/2结果为2.5 2
// x//y 将x除以y,取整数部分 5//2结果为2 2
% x%y 将x除以y,求余数 5%2结果为1 2
** x**y 求x的y次幂 5**2结果为25 1

注意:Python的除法规则和其他语言不一样,如果需要提高优先级请使用()
5887: 长方形的周长,长方形周长为(长+宽)*2
5887参考代码

a=input()
b=input()
print((int(a)+int(b))*2)

1488: C语言实验题――买糖果就需要用到我们的取余运算符了,我们可以将元转换为角,买到的糖果块数就是总价/单价的整数部分,余数就是剩下的钱
1488参考代码

n=int(input())*10
numbers=n//3
remain=n%3
print(numbers,remain)

1494: C语言实验题――温度转换要求给定一个华氏温度,输出摄氏温度。
本题输入为小数,所以类型为float,但是要求我们保留两位小数,这里可以用C语言的格式控制%.2f,之后跟上变量名称

格式化函数format()
格式:format(value[,fomat_spec])。
功能:将数据按foramt_spec格式规划表现形式。例如,浮点数格式[width].[.precision]表示宽度和精度
例如: >>> x=26.6666666666666668
    >>> printf(fomat(x,'.2f'))
      26.67

其他格式化参数

d  以十进制形式输出带符号整数(正数不输出符号)
o  以八进制形式输出无符号整数(不输出前缀O)
x  以十六进制形式输出无符号整数(不输出前缀OX)
u  以十进制形式输出无符号整数
f  以小数形式输出浮点数
e  以指数形式输出浮点数
g  以%f%e中较短的输出宽度输出浮点数
c  输出单个字符
s  输出字符串
标志字符为-、+、#、空格四种,其意义:
-  结果左对齐,右边填空格
+  输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号
#  对c,s,d,u类无影响;对o类, 在输出时加前缀。对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点

输出的格式控制

%nd n为指定的输出字段的宽度。如果数据的位数小于n,则左端补以空格,若大于n,则按实际位数输出。

%0nd n为指定的输出字段的宽度。如果数据的位数小于n,则左端补以0,若大于n,则按实际位数输出。

%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。

1494参考代码

F=float(input())
print('%.2f'%(5*(F-32)/9))

如果多个变量呢,如2982: 圆的直径、周长和面积这一题,我们可以一个一个输出
2982参考代码

PI=3.1415926
r=float(input())
d=2*r
circle=2*PI*r
area=PI*r**2 
print("%.2f"%d,"%.2f"%circle,"%.2f"%area)

接下来我们可以尝试下1491: C语言实验题――三角形面积,存在海伦公式\(S=\sqrt{p(p−a)(p−b)(p−c)}\) p为三角形周长的一半。开根号也就是0.5次幂
1491参考代码

a=float(input())
b=float(input())
c=float(input())
p=(a+b+c)/2
print("%.3f"%((p*(p-a)*(p-b)*(p-c))**0.5))

练习:6656 5972 6658 6650 6780 6779 6781 6784 6785 6013 1472 5174

三、选择结构

和之前顺序结构不同,有时候我们需要有选择执行某些语句,比如“如果明天下雨,那么明天就不去公园了”;“如果出门前告诉妈妈,那么她不会担心我们;否则她会非常担心我们”也就是if条件语句。其语法结构如下所示
if <条件> :
  <语句块1>
[else:
  <语句块2>]
if条件语句由if关键字构成,后面跟一个条件和一个冒号。冒号的作用是告知接下来要创建一个新的语句块,处于同一缩进位置的代码块组成一个语句块。

Python 关系表达式
关系表达式指用关系运算符,连接两个类型相同的数据组成的表达式。关系表达式的值是布尔型:真或假(True或False)。

Python常见的关系运算符

关系运算符 表达式 描述 优先级
>,< x>y,x<y x大于y,x小于y 4
>=,<= x>=y,x<=y x大于等于y,x小于等于y 4
==,!= x==y,x!=y x等于y,x不等于y 4
in x in y x是y的成员 5

1.两个数中较大的数

6810: 两个数较大,给定两个数让我们求较大的。
6810参考代码

a=int(input())
b=int(input())
if a>b:
    print(a)
else:
    print(b)

练习:6811 6774 6798 6772 5354 6009 6649 5892

2.登录账号密码及瓶盖领奖

6812: Alice的登录账号密码需要我们一个程序去检验其账号和密码。要同时满足账号和密码都是对的,这个可以用什么呢,可以用逻辑表达式中的与。

Python 逻辑表达式
逻辑表达式指用逻辑运算符,把逻辑变量连接起来的表达式。逻辑表达式的值仍是布尔型:真或假(True或False)。

Python常见的逻辑运算符

逻辑运算符 表达式 描述 优先级
and x and y x且y 7
or x or y x或y 8
not not x 非x 6

与其他语言不同的是, and中含0,返回0; 均为非0时,返回后一个值。or中, 至少有一个非0时,返回第一个非0值。

6812参考代码

user = input()
pwd = input()
if user == "admin" and pwd=="Python@16":
    print("Login successful")
else:
    print("Username or password is wrong")

可以尝试下1485: C语言实验题――整除,整除也就是取余后为0。

参考代码
x = int(input())
if x % 3 ==0 and x % 5 == 0:
    print('Yes')
else:
    print('No')

我们来看一下6763: 收集瓶盖赢大奖,满足一个条件即可。需要运算我们逻辑运算符的or。
6763参考代码

a=int(input())
b=int(input())
if a>=10 or b>=20:
    print("1")
else:
    print("0")

6766: 三角形判断,三角形满足两边之和大于第三边,所以我们需要把三个条件全都判断以下

a=int(input())
b=int(input())
c=int(input())
if a+b>c and b+c>a and a+c>b:
    print("1")
else:
    print("0")

练习:6765 5893 6767 6435 6793

3.游船数量及出租车收费

6445: 小z游东湖,大船可以乘6人,小船可以乘4人, x 人准备一起划船,最少需要多少条船。首先会选择大船,因为大船坐人多。余1~4可以选1条小船,余5人可以选1条大船。这个题目不关心你选的大船还是小船,所以只需要有人剩下就选择一条大船就可以了。

a=int(input())
if a%6==0:
    print(a//6)
else:
    print(a//6+1)

当然我们也可以用roud函数进行向上取整,如果给定为小数,那么将其+0.5之后四舍五入即可。

函数格式:round(number)。
函数功能:返回浮点数number的四舍五入值。

a=int(input())
ans=a/6
if ans==int(ans):
    print(int(ans))
else:
    print(round(ans+0.5))

6792: 出租车收费3千米以内(含3千米)收费10元,超过3千米的部分每千米收费2元(不足1km按1km算)。给定行驶路程s,问我们费用y。
首先这是一个分段函数,需要将其分成s<=3和s>3的情况。

\[\begin{equation} y= \begin{cases} 10&\mbox{s<=3}\\ 10+(\lceil s \rceil -3) \times 2&\mbox{s>3} \end{cases} \end{equation} \]

我们可以根据以上式子转换为代码

s=float(input())
#向上取整
if int(s)!=s:
    s=round(s+0.5)
#计算金额
if s<=3:
    m=10
else:
    #由于s可能是浮点数,所以这里不转换,输出需要转换一下
    m=10+(s-3)*2
print(int(m))

+0.5比较鸡肋,不是整数直接+1写起来更简单

s=float(input())
#向上取整
if int(s)!=s:
    s=int(s)+1
else:
    s=int(s)
#计算金额
if s<=3:
    m=10
else:
    m=10+(s-3)*2
print(m)

练习:6651 6632 6587 6768

4.判断闰年

闰年很熟悉吧,四年一闰,百年不闰,四百年又闰。所以闰年满足什么条件呢,如果是4的倍数可能是闰年,但是世纪年不是闰年,而且四百的倍数是闰年。
所以满足是4的倍数而且不是100的倍数就是闰年,但是如果是400的倍数也是,也就是条件的嵌套,我们可以使用elif语句。
if <条件> :
  <语句块1>
elif <条件2>:
  <语句块2>
···
elif <条件n>:
  <语句块n>
[else:
  <语句块2>]
6773: 闰年判断可以尝试下

year = int(input())
if year % 4 == 0 and year % 100 != 0:
    print(1)
elif year % 400 == 0:
    print(1)
else:
    print(0)

当然两个的闰年条件我们可以合并,与的运算符大于或的运算符,可以不用()

year = int(input())
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
    print(1)
else:
    print(0)

5908: 三个数的最大值
练习:

三、循环结构

1.for循环

输出字符串的各个字符
str="Python3"
for i in str:
print(i)

range()函数
格式:range([start,]stop[,step])。
功能:创建一个整数列表。
参数:起始值(缺省值为0),终值(但不包括),步长(缺省为1)。

计算1~100所有奇数的和
sum=0
for i in range(1,101,2):
sum=sum+i
print("1~100的所有奇数的和:",sum)

输出列表的各个元素。

输出列表中各个元素

lst=["apple","banana","peach"]
n=len(lst)
for index in range(n):
print("当前水果:",lst[index])

利用len()函数输出"Python3"各个字符
str="Python3"
n=len(str)
for i in range(n):
print(str[i])

2.while循环

3.二重循环

4.打印图形

四、枚举

五、模拟

6741: 动动有奖
“动动有奖”是某手机走路计步器程序,它能根据系统传递给它的走路步数给运动者奖励,运动者可以用累计的“奖金”去换取软件开发商提供的各种体育用品。具体的奖励规则如下:
1.每天走路的前1000步奖励0.3金,之后每2000步奖励0.1金(不足2000步没有奖励),每天最高奖励不超过3金。
2.每天必须到计步器页面点击“领奖”按钮,才能领取昨日走路奖金。
3.如果连续3天领奖成功,从第4天起走路奖金翻1倍(乘以2),每天最高奖励不超过6金。翻倍期间若有1天没有领奖(即连续每天领奖行为中断),则翻倍权益取消,重新连续3天领奖成功才能继续翻倍。
现在给你n天的领取情况,并给你每天的走路步数Xi和是否成功领取第i天“奖金”的标记Fi,请你帮忙算算可以拿到多少奖金。

六、数组与链表

6881: 生产数据合并
生产厂家总会根据各地产品销量的数据来分析来预估市场情况,并为后续调整生产规划、完善营销策略提供依据。
由于数据量巨大,为了充分运用分布式处理的又是,总部会要求各下属地区上报数据时,按各产品销量进行从大到小的排序。
总部收到数据后的第一件事是将所有数据合并并按照销量进行降序排序(从大到小)。
各个地区的数据问题可以简化为2个地区的数据合并问题,当2个地区的数据合并完成后,剩余各地区的数据合并就可以按照同样方式完成。
现在第1个地区有n个产品销量数据,第2个地区有m个产品销量数据,请你完成对数据的合并。

函数和方法 功能 实例
len(x) 统计字符串x中个数 list=[]
print(len(list))
输出为:0
list.append(x) 在列表末尾添加元素x list=[22,33,44]
list.append(55)
print(list)
输出为:[22,33,44,55]
list.insert(i,x) 在列表中下标为i位置处插入x list=["A", "B", "D"]
list.insert(2,"C")
print(list)
输出为:["A", "B", "C", "D"]
list.pop(i) 将list中下标为i的元素删除;若i不指定,默认为-1,即最后一个 list=["A", "B", "C", "D"]
list.pop(2)
print(list)
输出为:["A", "B", "D"]

七、字符串、队列和栈

凯撒密码是一种简单的置换密码,通过换位来实现加密。
例如,密文字母表是由正常顺序的明文字母表右移3个字母得到的,如图所示。

加密过程可表示为Ci=Ek1(Pi)=(Pi+3)mod26,这里的密钥为3。

def change(code,key):
    if 'a'<=code<='z':
        m=ord(code)-ord('a')+key
        return chr((m+26)%26+ord('a'))
    if 'A'<=code<='Z':
        m=ord(code)-ord('A')+key
        return chr((m+26)%26+ord('A'))
    return code

def  encrypt(code,key):
    code_new =""
    for s in code:
        code_new += change(s,key)
    print(code_new)
    return code_new

def  decrypt(code,key):
    code_new =""
    for s in code:
        code_new +=change(s,-key)
    print(code_new)
    return code_new
函数和方法 功能 实例
len(x) 统计字符串x中字符的个数 x="Hello!"
print(len(x))
输出为:6
x.find(y) 返回字符串x中子串y出现的首字母下标,若找不到,则输出-1 x="Hello!"
y="llo"
print(x.find(y))
输出为:2
x.split(str="", num=string.count(str)) 以str分隔符切片x,如果num有指定值,那么仅分隔num个子串。切片得到的值存储在列表中 x="I like Python"
list=x.split()
print(list)
输出:
['I', 'like', 'Python']
x.replace(old,new[,max]) 返回字符串中的old(旧字符串)替换成new(新字符串)后生成的新字符串,如果指定第三个参数max,那么替换不超过max次 x="is is is is"
print(x.replace("is","was"))
print(x.replace("is","was",3))
输出:
was was was was
was was was is
x.upper() 把字符串x中的小写字母转换成大写字母 x="I like Python"
y=x.upper()
print(y)
输出:
I LIKE PYTHON
x.lower() 把字符串x中的大写字母转换成小写字母 x="I like Python"
y=x.lower()
print(y)
输出:
i like python

八、树

九、迭代与递归

十、数据排序

十一、数据查找

posted @ 2021-01-28 19:57  暴力都不会的蒟蒻  阅读(182)  评论(2编辑  收藏  举报