Problem 1:
编写以下两个函数:
- 检查一个整数是否是一个质数:isPrime(number)
- 输出前 N 个质数:printPrimeNumbers(N) ,将输出结果写入文件,命名
为 FirstN_Prime_Numbers.txt,N 应为相应的数字。
1.定义素数判断函数
从2到number - 1,判断是否可以整除
1.def isPrime(number):
2. x = number
3. for i in range(2, number):
4. if x % i == 0:
5. return False
6. return True
2.文件读写
为数据集创建文件夹,首先判断文件夹是否存在,如果不存在则调用os.makedirs创建文件夹。
1.if os.path.exists('./problem1_data') == False:
2. os.makedirs('./problem1_data')
打开文件,为写入做准备(如果文件不存在,会自动创建)
1.f = open("./problem1_data/First"+str(N)+"_Prime_Numbers.txt", mode="w")
利用循环语句判断质数,直到输出满N个数字。
1.while True:
2. if cnt >= N:
3. break
4. if isPrime(i):
5. f.write(str(i)+' ')
6. cnt += 1
7. i += 1
其中文件写入函数为
1.f.write(str(i)+' ')
代码:
import os
def isPrime(number):
x = number
for i in range(2, number):
if x % i == 0:
return False
return True
def printPrimeNumbers(N):
cnt = 0
i = 2
if os.path.exists('./problem1_data') == False:
os.makedirs('./problem1_data')
f = open("./problem1_data/First"+str(N)+"_Prime_Numbers.txt", mode="w")
while True:
if cnt >= N:
break
if isPrime(i):
f.write(str(i)+' ')
cnt += 1
i += 1
f.write('\n')
f.close()
if __name__ == '__main__':
N = int(input("请输入一个整数:"))
if isPrime(N):
print("这是一个质数")
else:
print("这是一个合数")
N = int(input("打印前N个质数:"))
printPrimeNumbers(N)
Problem 2:
emirp数是一种特殊的质数,它反向书写时也是一个质数。例如,17和71都是质数,所以17和71都是emirp数。编写一个函数emirp(N),输出前N个emirp数到文件中,每行最多显示10个数字,如下所示。文件命名为FirstN_Emirp_Numbers.txt,N应为相应的数字。
-
素数判断判断函数与文件创建与Problem1相同,不再展示
-
差别在于文件写入的判断。
其中将数字以字符串形式储存,反转可以利用切片并以-1为间隔。
在判断时,将字符串转换为int类型,进行素数判断。
数字10个换行的方法时根据输出计数器是否是10的倍数进行判断。
1. while True:
2. num = str(i)
3. if cnt >= N:
4. break
5. if isPrime(num) and isPrime(num[::-1]):
6. f.write(num + ' ')
7. cnt += 1
8. if cnt % 10 == 0:
9. f.write('\n')
10. i += 1
11.f.close()
代码:
import os
def isPrime(number):
x = int(number)
for i in range(2, int(number)):
if x % i == 0:
return False
return True
def printEmirpNumbers(N):
cnt = 0
i = 10
if os.path.exists('./problem2_data') == False:
os.makedirs('./problem2_data')
f = open("./problem2_data/First"+str(N)+"_Emirp_Numbers.txt", mode="w")
while True:
num = str(i)
if cnt >= N:
break
if isPrime(num) and isPrime(num[::-1]):
f.write(num + ' ')
cnt += 1
if cnt % 10 == 0:
f.write('\n')
i += 1
f.close()
if __name__ == '__main__':
N = int(input("打印前N个emirp数:"))
printEmirpNumbers(N)
Problem 3:
近似平方根:有几种方法可以实现 Python math 模块中的 sqrt 函数,其中一种方法被称为巴比伦函数法。它使用以下公式,不断逼近一个数 n 的平方根nextGuess=(lastGuess+(n/lastGuess))/2当 nextGuess 和 lastGuess 几乎相同时,nextGuess 就是近似平方根。初始猜测,即 lastGuess 的起始值,可以是任何正值(例如 1)。如果 nextGuess 和 lastGuess小于一个非常小的数字,例如 0.0001,那么可以说 nextGuess 是 n 的近似平方根, 如果不是,则 nextGuess 变为 lastGuess,近似过程继续。根据以上方法,实现返
回 n 的平方根的函数 my_sqrt(n)。
- 编写my_sqrt(n)函数
利用迭代法,判断nextGuess与lastGuess是否相等(二者差值小于0.0001),否则套用公式更新nextGuess与lastGuess的值
1.def my_sqrt(n):
2. nextGuess, lastGuess = n, 1
3. while math.fabs(nextGuess-lastGuess) > 0.0001:
4. lastGuess = nextGuess
5. nextGuess = (lastGuess+n/lastGuess)/2
6. return nextGuess
代码:
import math
def my_sqrt(n):
nextGuess, lastGuess = n, 1
while math.fabs(nextGuess-lastGuess) > 0.0001:
lastGuess = nextGuess
nextGuess = (lastGuess+n/lastGuess)/2
return nextGuess
if __name__ == '__main__':
n = int(input("请输入一个整数:"))
print("平方根为:" + str(my_sqrt(n)))
Problem 4:
自定义 Triangle 模块:编写一个模块 Triangle,包含以下三个函数:
- isValid(side1, side2, side3): 输入三条边长度,判断是否组成三角形;
- perimeter(side1, side2, side3): 输入三条边长度,求三角形周长
- area(side1, side2, side3): 输入三条边长度,求三角形面积。
1.首先定义Triangle模块,创建Triangle.py
1.1 定义isValid(side1, side2, side3)函数
判断条件是“两边之和大于第三边”,所以首先调用sorted函数将三条边进行排序,然后判断最短的两边是否大于最长边。
Sorted函数的用法是传入一个list,返回从小到大的已排序list。
1.def isValid(side1, side2, side3):
2. sides = [side1, side2, side3]
3. if sorted(sides)[0]+sorted(sides)[1] > sorted(sides)[2]:
4. print("可以组成三角形。")
5. return True
6. else:
7. print("不可以组成三角形。")
8. return False
1.2 定义perimeter(side1, side2, side3)函数
周长即返回三边之和
1.def perimeter(side1, side2, side3):
2. print("三角形周长是:", side1+side2+side3)
1.3 定义area(side1, side2, side3)函数
已知三边求三角形面积,利用海伦公式即可。
1.def area(side1, side2, side3):
2. p = (side1+side2+side3)/2
3. print("三角形面积是:", math.sqrt(p*(p-side1)*(p-side2)*(p-side3)))
2.使用Triangle.py模块
首先import所需要的模块(注意必须在同一路径下)
1.import Triangle
多组数据输入的方式是如下格式
1.map(eval, input("").split())
Problem 5:
海龟绘图:自学 Python 自带的 turtle 模块,完成以下两个任务:
-
仔细阅读代码 exp2.5_example.py 并运行,回答以下问题:
A. 运行代码后,你看到了什么?
如图所示:
B. 解释以下函数的含义:
up(), down(), goto(), circle(), forward(), right(), left(), speed()
up():移动时不绘制图形
down():移动时绘制图形,缺省时也为绘制
goto(x, y):将画笔移动到坐标为x,y的位置
circle®:以当前位置为圆心,半径为r,画圆
forward(degree):向前移动距离degree代表距离
right(degree):向右移动多少度
left(degree):向左移动多少度
speed(speed):画笔绘制的速度范围[0,10]整数 -
用 turtle 模块作出一幅你满意的画。
最终图:
步骤:
- 首先定义画布大小、画笔速度、粗细等,等一些属性
1.t.setup(700, 500)
2.t.screensize(800, 800, "black")
3.t.pencolor("red")
4.t.speed(10)
5.t.pensize(5)
6.t.goto(-300, 200)
7.t.clear()
8.t.hideturtle()
- 绘制国旗四周边框,并以红色填充
1. t.fillcolor("red")
2.t.begin_fill()
3.for _ in range(2):
4. t.forward(600)
5. t.right(90)
6. t.forward(400)
7. t.right(90)
8.t.end_fill()
9.t.penup()
3. 绘制大五角星,以黄色填充(五角星绘制方法会旋转五次144°并绘制登场直线)
1. t.pensize(1)
2.t.goto(-250, 74)
3.t.pendown()
4.t.setheading()(72)
5.t.fillcolor("yellow")
6.t.begin_fill()
7.for _ in range(5):
8. t.forward(90)
9. t.right(144)
10.t.end_fill()
4. 绘制4个小五角星
1.for _ in range(4):
2. T.setheading(D[q])
3. t.begin_fill()
4. t.penup()
5. t.goto(X[q], Y[q])
6. t.pendown()
7. for _ in range(5):
8. t.forward(long)
9. t.right(144)
10. t.end_fill()
11. q += 1
代码:
import turtle as t
x = 1
y = 1
d = 1
long = 33
X = [-169, -171, -128, -139]
Y = [158, 33, 110, 65]
D = [53, 53, 106, 74]
q = 0
t.setup(700, 500)
t.screensize(800, 800, "black")
t.pencolor("red")
t.speed(10)
t.pensize(5)
t.goto(-300, 200)
t.clear()
t.hideturtle()
t.fillcolor("red")
t.begin_fill()
for _ in range(2):
t.forward(600)
t.right(90)
t.forward(400)
t.right(90)
t.end_fill()
t.penup()
t.pencolor("yellow")
t.pensize(1)
t.goto(-250, 74)
t.pendown()
t.setheading(72)
t.fillcolor("yellow")
t.begin_fill()
for _ in range(5):
t.forward(90)
t.right(144)
t.end_fill()
for _ in range(4):
t.setheading(D[q])
t.begin_fill()
t.penup()
t.goto(X[q], Y[q])
t.pendown()
for _ in range(5):
t.forward(long)
t.right(144)
t.end_fill()
q += 1
t.done()