1.绘制奥运五环旗
#奥运五环的绘制
import turtle as t
t.pensize(3)
t.speed(0)
def draw_circles():i=0while 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+=1t.hideturtle()t.done()
draw_circles()
结果及分析:
由于绘制五个不同颜色的环,且存在先后顺序问题,加之这些环的圆心坐标和颜色是可变参数。因此采用定义二维数组的形式来给定参数(这样做的好处是避免代码行数太长,而且很直观)具体做法是:定义i作为二维数组的索引,给定初始值为0,设定while循环,当画完最后一个圆环时结束程序。
2.双弧外摆线的绘制
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 循环的结构程序设计完成。
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个数字。
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+=1else:i+=1
结果及分析:
千位和个位除0之外任取,百位和十位并没有约束。代码由两部分组成,第一部分,通过三个嵌套的for 循环进行回文数判断并逐个放入result列表中。
第二部分是对列表元素有控制条件的输出。首先加上一个while循环对索引i控制阈值上限,在输出元素后,利用if-else判断是第几个元素,若是第十个,使用print()进行换行操作。最后i+=1进行变量更新。
5.杨辉三角
实现杨辉三角前10行的输出
def yh_triangle(n):#n为需要输出的行数,n=实际行数-1ls=[]if n == 0:ls = [1]elif n == 1:ls = [[1],[1,1]]else:j = 2ls = [[1], [1, 1]]for i in range(0, n - 1):ls.append([])# 创建[[],[],[],[]],个数取决于nwhile 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 += 1p_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.
def myfunc(x,n):x = str(x)if n==0:return 0else: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
import math as m
def cos(x):cos,j,a,i= 0,0,1,0while abs(a)>0.01:a = (pow(x,i)/m.factorial(i))i =i+ 2b = (-1)**(j)j = j+1c = a * bcos = cos + celse: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小的所有亲密数。
def s_num(n):#找出比n小的所有数,不包含nfor i in range(1,n):factor(i)#将找到的小于n的数传递给factor函数if i == n-1:search(result)#当完成小于n的所有数的对应因数相加时,调用search函数进行亲密数寻找
def factor(m):#factor函数,找出m的因数并相加,在此基础上创建一个字典,键(数m)-值(对应因数之和)i= 1while i < m:#寻找因数并求和sum = 0if m % i == 0:result[m] = result.get(m,0)+ii += 1else: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中。
=====================================
欢迎指正!