单选题1:
设 s ='Hello Lan Qiao',执行 print(s [4:11])输出的结果为( )。 A、lo Lan Qi B、lo Lan Q C、 o Lan Qi D、o Lan Q
答案:D
单选题2:循环语句 for i in range(8,-4,-2):执行了几次循环( )。 A、 4 B 、5 C、 6 D、7
答案:C 植树问题,含头不含尾,点数等于段数=(-4-8)/-2=6
单选题3:
导入 random 模块后,执行 print(random.randrange(10, 100, 2))语句,输出的结果可能是( )A、1 B、24 C、63 D、100
答案:B random.randrange的定义域是半开,所以不可能是100。
单选题4:执行以下程序,输出的结果是( )。height = {’小蓝 ’:80,’小青’:100,’小圃 ’:70}height [’小青’] = 70 print(sum(height.values())) A、220 B 、210 C、 250 D、 7
答案:A
单选题5:
导入 turtle 模块后,执行 turtle.circle(80,steps=6)语句,所绘制的图形以下说法正确的是( )。A、绘制出一个半径为 80 像素的圆 B、 绘制出六个半径为 80 像素的圆 C、绘制出一个半径为 80 像素的圆和一个六边形 D、绘制出一个半径为 80 像素的圆内接正
答案:D turtle.circle实际是绘制正多边形的函数,默认情况steps(边长数)比较大,看起来像圆。绘制起始点在圆周上,半径可正可负,当半径为正,圆心在前进方向的左侧,为负时在右侧。对于一些高分辨率的电脑,可以把steps设置得更大来改变所绘制的圆的精度。还可以有第二个参数extent是绘制圆弧的角度大小,单位默认是角度(一周角=360°),turtle.radians()切换为弧度制(一周角=2π),turtle.degrees()切换为角度制。
编程题1: 编程实现: 给定一个正整数N,计算N除以7的商。 输入描述:输入一个正整数N 输出描述:输出N除以7的商(商为整数) 样例输入:8 样例输出:1代码:
·
·
N=int(input())print(N//7)
编程题2: 编程实现: 给定一个正整数N,计算出1到N之间所有奇数的和。 输入描述:输入一个正整数N 输出描述:输出1到N之间(包含1和N)所有奇数的和 样例输入:5 样例输出:9代码:
·
·
·
·
·
·
N=int(input())sv=0for i in range(1,N+1,2): sv += i print(sv)
编程题3: 提示信息: “水仙花数”是指一个三位正整数,其各位数字立方的和等于该数本身。 例如:153是一个“水仙花数”,因为1³+5³+3³等于153。 编程实现: 给定一个正整数N,判断100到N之间有多少个“水仙花数”。 输入描述:输入一个正整数N(100<N<1000) 输出描述:输出100到N之间(包含100和N)有多少个“水仙花数” 样例输入:160 样例输出:1代码:
·
·
·
·
·
·
·
·
·
·
·
·
N = int(input())sv = 0for i in range(100,N+1): tmp = i a = tmp % 10 #个位 tmp //= 10 b = tmp % 10 #十位 c = tmp // 10 #百位 if a**3 + b**3 + c**3 == i: sv += 1 print(sv)
编程题4: 编程实现: 有一组连续正整数,随机乱序后生成一组数据后,小蓝不小心删掉了其中一个数,已知所删掉的这个数不是这组数据中最小的也不是最大的,现在请你编写程序帮助小蓝找到删除的那个数。 输入描述: 按照“编程实现”中的描述模仿输入一组这样的正整数(正整数之间以英文逗号隔开),在输入的时候少 一个数(这个数不是这组数据中最小的也不是最大的),这个数作为小蓝删除掉的那个数,且加上小蓝删除的那个数这组数据是连续的整数列。 输出描述:输出删除掉的是那个数 样例输入:3,2,4,6,7 样例输出:5代码:
·
·
·
·
·
·
·
·
·
·
·
·
lst = [int(x) for x in input().split(',')]lst.sort()start = lst[0]num = Nonefor i in range(1,len(lst)): if lst[i] > start + 1: num = start + 1 break else: start = lst[i]if num: print(num)
解说:连续整数相邻数字之差是1,如果大于1,那么中间的数丢了。
编程题5: 提示信息: 有一个密室逃脱游戏,有100间密室连在一排。密室编号是从1开始连续排列一直排到第100间密室,如下图: 游戏规则: 1. 玩家初始位置在1号密室; 2. 每次玩家可以进入右边的一个密室,也可以跳过一个密室进入下个密室(如:当玩家当前在3号密室,他可以进入4号密室也可以进入5号密室); 3. 有毒气的密室不能进入需要避开。 编程实现: 给定三个正整数X,Y,M(X<Y<M≤100),表示三个密室编号。X号密室和Y号密室有毒气泄漏,不能进入,玩家需要进入到M号密室。按照游戏规则进入M号密室有多少种路线方案。 例如:X=2,Y=4,M=7,进入M号密室有2种路线方案,分别是1->3->5->6->7路线和1->3->5->7路线。 输入描述:输入三个正整数X,Y,M(X<Y<M),X和Y表示有毒气密室编号,M表示需要进入的密室编号,且三个正整数之间以英文逗号隔开 输出描述:输出进入M号密室有多少种路线方案 样例输入:2,4,7 样例输出:2代码:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
X, Y, M = map(int, input().split(','))count = 0def compu(room): global count if room == M: count += 1 return elif room == X or room == Y or room > M: return else: compu(room+1) compu(room+2) compu(1)print(count)
解说:
首先忽略限制条件(没有毒气泄漏),从1号室到M号室有多少中走法,假如M=7,线路绘图如下:
由图可见没有限制条件,从1号室到7号室有13种路径,下面采用递归法计算看看结果:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
M = 7count = 0def compu(room): global count if room == M: count += 1 return elif room > M: return else: compu(room+1) compu(room+2) compu(1)print(count)
运行结果是13。现在加入不能经2,4号室,即把经过2,4号室的路径删除,如下图:
可见有2种方案。加入过滤条件,程序如下:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
X, Y, M = 2, 4, 7count = 0def compu(room): global count if room == M: count += 1 return elif room == X or room == Y or room > M: return else: compu(room+1) compu(room+2) compu(1)print(count)
结果是2。
编程题6:
编程实现:
有一个N*N的矩阵方格和N个棋子,现在需要将N个棋子按要求放置到矩阵方格中。 要求如下: 1.任意两个棋子不能在同一行 2.任意两个棋子不能在同一列 3.任意两个棋子不能在同一对角线上(下图红色线段都为对角线) 根据以上要求,问N个棋子放置到N*N矩阵方格中有多少种放置方案 例如:4*4的矩阵方格,4个棋子,有2种放置方案 输入描述:输入一个正整数 N(1<N<11),表示一个 N*N 的矩阵方格和 N 个棋子数量 输出描述:输出 N 个棋子按要求放置到 N*N 的矩阵方格中有多少种放置方案 样例输入:4 样例输出:2代码:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
N = int(input())
def backCheck(queen): (row, col, fatherQueen) = queen while fatherQueen != None: (row1, col1, fatherQueen) = fatherQueen if row1 == row or col1 == col or abs(col-col1) == row-row1: return False return True count = 0
def eightQueens(queen, n): global count if n == N: count += 1 return for col in range(N): nextQueen = n, col, queen if backCheck(nextQueen): eightQueens(nextQueen, n+1) for col in range(N): rootQueen = 0, col, None eightQueens(rootQueen , 1) print(count)
解说:
这是非常常见的“八皇后问题”,要是没学过也不要心慌。拿起我们的法宝——减少条件,编好程序,运行正常后加入被减少的条件,如果原来的程序不适合,重构代码也不难了。 先考虑把N个对象放入N*N矩阵中,每行1个的方案数。第一行每个位置(用行列二元组)作为根节点,用一个循环调用树叶统计递归函数:
·
·
·
for col in range(N): rootQueen = (0, col) eightQueens(rootQueen , 1) #1但前行数,当=N返回。
递归函数eightQueens要在每行中选一个点,然后下推到下一行,当行数达到N时,计算一个方案,然后返回。代码如下。
·
·
·
·
·
·
·
·
·
·
count = 0
def eightQueens(queen, n): global count if n == N: count += 1 return for col in range(N): nextQueen = (n, col) eightQueens(nextQueen, n+1)
N=4时完整代码如下:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
N = 4
count = 0
def eightQueens(queen, n): global count if n == N: count += 1 return for col in range(N): nextQueen = (n, col) eightQueens(nextQueen, n+1) for col in range(N): rootQueen = (0, col) eightQueens(rootQueen , 1) #1但前行数,当=N返回。 print(count)
运行结果是256,4×4×4×4=256,说明代码没问题。 现在考虑限制条件问题,同行同列这容易,主要是对角线,不过同一对角线上的点横坐标之差和纵坐标之差绝对值相等,反之亦然。 但在上面的代码中,无法知道前面的点的坐标。很自然,每个点除了保持坐标外还至少要知道它前面一个点的引用。这种朝一个方向的引用数据结构就是所谓的“单向链表”。当要生长一个点时,我们可以用递归或循环检查这个点是否符合这三个条件,代码如下:
·
·
·
·
·
·
·
def backCheck(queen): (row, col, fatherQueen) = queen while fatherQueen != None: (row1, col1, fatherQueen) = fatherQueen if row1 == row or col1 == col or abs(col-col1) == row-row1: return False return True
把对象拆为行、列和前一点的引用,在链表中逐点往回比较,直到根节点。
重构代码,加入过滤条件,完成。