1.绘制奥运五环旗
python
#奥运五环的绘制
import turtle as t
t.pensize(3)
t.speed(0)
def draw_circles():
i=0
while i <=4:
args = [[-60,0,"blue"],[0,0,"black"],[60,0,"red"],[-30,-30,"yellow"],[30,-30,"green"]]#定义一个参数列表
t.penup()
t.goto(args[i][0],args[i][1])
t.pendown()
t.color(args[i][2])
t.circle(40)
i+=1
t.hideturtle()
t.done()
draw_circles()
结果及分析:
由于绘制五个不同颜色的环,且存在先后顺序问题,加之这些环的圆心坐标和颜色是可变参数。因此采用定义二维数组的形式来给定参数(这样做的好处是避免代码行数太长,而且很直观)具体做法是:定义i作为二维数组的索引,给定初始值为0,设定while循环,当画完最后一个圆环时结束程序。
2.双弧外摆线的绘制
python
import turtle as t
import math as m
t.speed(0)
i = 0
while i <=2*m.pi:#描点法绘制双弧外摆线
t.penup()
x = 3 * 25 * m.cos(i) + 25 * m.cos(3 * i)
y = 3 * 25 * m.sin(i) + 25 * m.sin(3 * i)
t.goto(x,y)
t.pendown()
t.dot(5,"black")
i+=0.01
t.done()
结果及分析:
引入turtle和math库,并利用while循环,选定2*pi作为循环控制条件,再基于"描点法"绘制函数图像,将点和点之间的间隔设置为0.01,通过对点的绘制进行参数控制进而绘制出双弧外摆线。
3.编写程序绘制下图,使用while 循环的结构程序设计完成。
python
ch,i= '*',0
args=[5,3,1,3,5]
while i <=4:
print("{0: ^5}".format(ch*args[i]))
i+=1
结果分析:基本元素为'*',解决这个问题的关键在于每行'*'的个数不一样。定义一个列表储存每行对应基本元素的个数,并使用while循环控制。
**4.**回数
回数是一种特殊的数,其正向与反向所表示的数值相等。如果数abcd=dcba,则称数abcd为回数,这里a,b,c,d表示0-9之间的数字符号,如1111,1221,2002等。请编写程序,找出并显示1000到9999之间的回数,分行显示,每行显示10个数字。
python
result = []
for a in range(1,10):
for b in range(0,10):
for c in range(0,10):
for d in range(1,10):
if a*1000 + b*100 + c*10 + d == d*1000 + c*100 + b*10 + a:
result.append(str(a)+str(b)+str(c)+str(d))
i = 0
while i<len(result): #输出控制函数
print("{} ".format(result[i]),end = '')
if (i+1)%10 == 0:
print()
i+=1
else:
i+=1
结果及分析:
千位和个位除 0 之外任取,百位和十位并没有约束。代码由两部分组成,第一部分,通过三个嵌套的 for 循环进行回文数判断并逐个放入 result 列表中。
第二部分是对列表元素有控制条件的输出。首先加上一个 while 循环对索引 i 控制阈值上限,在输出元素后,利用 if-else 判断是第几个元素,若是第十个,使用 print() 进行换行操作。最后 i+=1 进行变量更新。
**5.**杨辉三角
实现杨辉三角前10行的输出
python
def yh_triangle(n):#n为需要输出的行数,n=实际行数-1
ls=[]
if n == 0:
ls = [1]
elif n == 1:
ls = [[1],[1,1]]
else:
j = 2
ls = [[1], [1, 1]]
for i in range(0, n - 1):
ls.append([])# 创建[[],[],[],[]],个数取决于n
while j <= n:
ls[j] = [1]
for k in range(1, j):
ls[j].append(ls[j - 1][k - 1] + ls[j - 1][k ])
ls[j].append(1)
j += 1
p_out(ls)
def p_out(ls): #输出函数
for i in range(0,len(ls)):
for j in range(0,len(ls[i])):
print("{} ".format(ls[i][j]),end='') #嵌套循环输出
print()
yh_triangle(9)
结果及分析:
本代码分为两部分:
第一部分是 yh_triangle(n)
n 为实际需要输出的行数减去 1 。创建空列表,此列表为 2 维列表,维数取决于行数。举个例子:若需要输出前 3 行,此列表为: [[1],[1,1],[1,2,1]], 以此类推。由于前两行并不存在特殊的杨辉三角规律,故放在 if-elif 结构里。倘若行数大于或等于 3 ,创建 [[1],[1,1],[]]. 最后子列表的元素运用杨辉三角规律。
第二部分是 p_out(ls) 函数
ls 在第一个函数结尾调用,其执行逻辑是:通过两个嵌套循环进行二维列表元素的遍历输出。在第二个循环结束时换行。
**6.**编写函数myfunc(x,n)
求多项式s=x+xx+xxx+xxxx+......+xx...x的和,并返回求出的和。其中x是1-9的数字,最后一项是n位都是x的数字。例如 x=2,n=6时输出 246912.
python
def myfunc(x,n):
x = str(x)
if n==0:
return 0
else:
return int(x*n) + int(myfunc(x, n - 1))
result = myfunc(2,6)
print(result)
结果及分析:
本代码使用了函数递归完成该题目,以x=2,n=6来说明。当调用此函数时,先将x转化为字符形式。进入if判断,当n == 0时,返回0,当n不为0时,int(x*n)=22222,并再次调用myfunc()函数。int(x,n)=2222,依次类推,最后结果为:0+2+22+222+2222+22222=246912。
7.编写函数求余弦函数的近似值
用下列公式求cos(x)的近似值,精确到最后一项绝对值小于0.01.
例如cos(-3.14)=-9.999899
python
import math as m
def cos(x):
cos,j,a,i= 0,0,1,0
while abs(a)>0.01:
a = (pow(x,i)/m.factorial(i))
i =i+ 2
b = (-1)**(j)
j = j+1
c = a * b
cos = cos + c
else:
return cos
m = cos(-3.14)
print("{:.6f}".format(m))
结果及分析:
本代码根据要求将cosx的公式进行了数学表达,总共拆分成了两个部分,一部分是"±",一部分是数的阶乘。通过引入math库实现阶乘的简单实现。实际上,本题也可以利用函数递归完成,但我考虑到第一问已经用了,所以这里换了一种方法。
8.亲密数
如果有两个自然数a和b,a的所有因子(比a小且能整除a的自然数)之和恰好等于b,并且b的所有因子之和恰好等于a,则称a和b是一对亲密数。例如220和284,因为220的全部因子(除去本身)相加是1+2+4+5+10+11+20+22+44+55+110=284,284的全部因子(除去本身)相加是1+2+4+71+142=220.请用户输入一个整数m,输出比m小的所有亲密数。
python
def s_num(n):#找出比n小的所有数,不包含n
for i in range(1,n):
factor(i)#将找到的小于n的数传递给factor函数
if i == n-1:
search(result)#当完成小于n的所有数的对应因数相加时,调用search函数进行亲密数寻找
def factor(m):#factor函数,找出m的因数并相加,在此基础上创建一个字典,键(数m)-值(对应因数之和)
i= 1
while i < m:#寻找因数并求和
sum = 0
if m % i == 0:
result[m] = result.get(m,0)+i
i += 1
else:
i += 1
def search(result):
res = []
for key, value in result.items():#依据亲密数的性质进行选择
if value in result and result[value] == key and value != key:
res.append((key, value))
for item in res:#去除冗余
if item[0]>item[1]:
res.remove(item)
print(res)
result = {}
s_num(100000)
结果及分析:
代码分为三个模块,第一个s_num(n),找出所有比n小的数且不包含n。第二个factor(m),寻找数m的所有因数,并将每个小于n的数作为键,把其因数之和作为值储存在result字典中。第三个search(result)函数,以字典result作为输入量,并用for循环遍历键值对。其中if结构的第一个条件判断当前value是否在字典result的键中(找出因数之和相等的数是否存在),第二个条件判断当前value对应的键的值是否等于key,第三个条件判断value是否等于key,这三个条件都满足则将当前的键值对添加到res中。
=====================================
欢迎指正!