亲密数

问题:如果 a 的所有正因子和等于b,b 的所有正因子和等于 a,因子包括1但不包括本身,且 a 不等于b,则称 a,b 为亲密数对。编写一个程序,求解范围内的亲密数。
思路:用 a 依次对 i (1~a/2) 求模,如果结果为0,则 i 为 a 的一个因数。

  1. def solve(n):
  2. sum_num = 0
  3. for i in range(1, int(n/2)+1):
  4. if n%i == 0:
  5. sum_num += i
  6. return sum_num
  7. n = int(input())
  8. for a in range(1, n):
  9. b = solve(a)
  10. if (solve(b) == a) and (b!=a):
  11. print(a, b)

自守数

自守数是指一个数的平方的末尾数等于该数自身的自然数。例如,5 和 6 是一位的自守数;25 和 76 是两位的自守数。编写一个程序,求解范围内的自守数。
重要特性:以自守数为后几位的两个数相乘,乘积的后几位仍是这个自守数(如176 * 576 = 101376)。也就是说,需要密切关注 n 位自守数与 (n+1) 位自守数之间的关系。

  1. for n in range(1,10000):
  2. # 求数的长度
  3. k=len(str(n))
  4. # 计算数的后几位
  5. t=(n*n) % (10**k)
  6. if t==n:
  7. print(n)

猜数大师

题目描述:
电脑能够随机地岀加減算式,并判断玩家回答的得数是否正确。
如果它出的是加法,则两个加数均是自然数且不能大于100;如果它出的是减法,则被减数和減数都要是自然数且小于100,同时被减数大于等于减数。
计算机会出5道题,之后由你来统计回答的正确次数。
关键:如何刻画计算机随机出加减法?

  1. if random.randint(0, 1) == 0:
  2. c = a + b
  3. else:
  4. b = random.randint(1, a) # 被减数大于减数
  5. c = a - b

绘制图形

语雀内容
题目描述:
使用画笔工具绘制图形,画笔的颜色为蓝色,画笔粗细为2,图形由_8个_5边形组合而成,图形的中心点在坐标在舞台的正中心,五边形边长为100,程序运行之后开始运行。

  1. import turtle
  2. screen = turtle.Screen()
  3. t = turtle.Turtle()
  4. t.pensive (2)
  5. t.pencolor("blue")
  6. for _ in range(8):
  7. for _ in range(5):
  8. t.forward(100)
  9. t.left(360/5)
  10. t.left(360/8)
  11. screen.mainloop()

image.png

夹数

如果num在一段数字范围内,则返回num;否则返回离这个范围最近的边界。
示例:

  1. >>> clamp(2, 3, 10)
  2. 2
  3. >>> clamp(7, 3, 10)
  4. 7
  5. >>> clamp(15, 3, 10)
  6. 10

解答:

  1. def clamp_num(num, a, b):
  2. return max(min(num, max(a, b)), min(a, b))

输入转数组

  1. num = int(input())
  2. l = list(map(lambda x:int(x),input().split(' ')))
  3. print(max(l))
  4. print(min(l))
  5. print(sum(l))

字符转ASCII码

使用 chr() 函数。

  1. >>> chr(65)
  2. 'A'

字符串列表中元素合并

  1. result = ''.join(a)

例如:

  1. for i in range(m):
  2. tstr.append(chr(i+65))
  3. result = ''.join(tstr)

join 相当于是 split 的反操作。

获得列表最大值的下标

  1. def max_idx(arr):
  2. return arr.index(max(arr))

试题 基础练习 字母图形

利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
image.png
数据规模与约定:
1 <= n, m <= 26。

  1. l = list(map(lambda x:int(x),input().split(' ')))
  2. n = l[0]
  3. m = l[1]
  4. all_str = []
  5. for i in range(26):
  6. all_str.append(chr(i+65))
  7. for i in range(26):
  8. all_str.append(chr(i+65))
  9. res = {}
  10. delta = 1
  11. for i in range(n):
  12. res[i] = all_str[0:m]
  13. print(''.join(res[i]))
  14. all_str.insert(0, all_str[delta+i])
  15. all_str.pop()
  16. delta+=1

计算年龄

张三、李四、王五、刘六的年龄是等差数列,他们四人的年龄相加是26,相乘是880。求以他们年龄为前4项的等差数列的前20项。
分析:这个题非常简单,遍历即可。设首个人年龄为 a,增量为 x,则核心是判断 a 和 x 的范围。
也就是判断出:a 的范围是[1, 4], x 的范围是[1, 6]
不然会把负数也算进来,虽然这个题很容易检查出来,但数据大了之后可能就不好检查了。因此一定要注意变量的范围

  1. for a in range(1, 4):
  2. for x in range(1, 6):
  3. if a*(a+x)*(a+2*x)*(26-3*a-3*x)==880:
  4. print(a, a+x, a+2*x, a+3*x)

image.png

金蝉素数

由1, 3, 5, 7, 9排列而成的五位素数,同时去掉最高位与最低位后的3位数是素数;同时去掉高二位与低二位后的1位数也是素数。求这些“金蝉素数”可能的解。
三步走:

  1. 生成1、3、5、7、9的全排列,每种排列的结果为一个元组
  2. 将元组转换为数字
  3. 判断是否为素数 ```python from itertools import permutations

def isPrime(n): for i in range(2, n//2+1): if(n % i == 0): return False return True

def tuple2num(t): return int(str(t).replace(“(“, “”).replace(“)”, “”).replace(“,”, “”).replace(“ “, “”))

for i in permutations([1,3,5,7,9],5): if (isPrime(tuple2num(i)) & isPrime(tuple2num(i[1:-1])) & isPrime(i[2])): print(i)

  1. <a name="qzDKd"></a>
  2. ## 小孩和饼干
  3. 问题描述:假设你是一位家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个**胃口值 gi **,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j 都有一个尺寸 sj 。**如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。**你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
  4. ```python
  5. # 胃口是g,饼干尺寸是s
  6. def findbis(g, s):
  7. g.sort()
  8. s.sort()
  9. child = 0
  10. biscuit = 0
  11. while child<len(g) and biscuit < len(s):
  12. if g[child]<=s[biscuit]:
  13. child += 1
  14. biscuit+=1
  15. return child
  16. g = [1, 1, 6]
  17. s = [1, 2, 5]
  18. x = findbis(g, s)
  19. print(x)

JewelsInStones

  1. # 查找J中的每个字符在S出现的次数的总和
  2. # Input: J="aA", S="aAAbbbb"
  3. # Output: 3
  4. def count_J_in_S(J, S):
  5. tempdict = {i: S.count(i) for i in set(S)}
  6. return sum(tempdict.get(i, 0) for i in set(J))
  7. j = input("请输入J:")
  8. s = input("请输入S:")
  9. print("结果为:", count_J_in_S(j, s))

对字典的使用,包括使用i: S.count(i)统计每个键及其出现的次数;get(i, 0)后的0是指设定默认值为0

找到第一个不重复字符

给定一个字符串,找到第一个不重复的字符,输出索引,如不存在输出 -1。
示例:

  1. s = "loveleetcode"
  2. return 2
  3. s = "leetcode"
  4. return 0
  5. s = "aa"
  6. return -1

代码:

  1. def findUnique(s):
  2. temp = {}
  3. for i in s:
  4. try:
  5. temp[i] += 1
  6. except:
  7. temp[i] = 1
  8. for idx, j in enumerate(s):
  9. if(temp[j]==1):
  10. return idx
  11. return -1
  12. s = input("Please input a string:")
  13. a = findUnique(s)
  14. print(a)

注意:这里使用了try...except...的方法获取字符串每个字母及其出现次数的字典。这实际上是简化的 if...else... 好处是这是按顺序排列的。
如果按照temp = {i:s.count(i) for i in s},则结果将是乱序的。
注意这里对enumerate的使用。
还有更好用的方法,是使用自带的 Counter ,这样就不需要 for 循环里套 try…except了:

  1. import collections
  2. temp = collections.Counter(s)