亲密数
问题:如果 a 的所有正因子和等于b,b 的所有正因子和等于 a,因子包括1但不包括本身,且 a 不等于b,则称 a,b 为亲密数对。编写一个程序,求解范围内的亲密数。
思路:用 a 依次对 i (1~a/2) 求模,如果结果为0,则 i 为 a 的一个因数。
def solve(n):
sum_num = 0
for i in range(1, int(n/2)+1):
if n%i == 0:
sum_num += i
return sum_num
n = int(input())
for a in range(1, n):
b = solve(a)
if (solve(b) == a) and (b!=a):
print(a, b)
自守数
自守数是指一个数的平方的末尾数等于该数自身的自然数。例如,5 和 6 是一位的自守数;25 和 76 是两位的自守数。编写一个程序,求解范围内的自守数。
重要特性:以自守数为后几位的两个数相乘,乘积的后几位仍是这个自守数(如176 * 576 = 101376)。也就是说,需要密切关注 n 位自守数与 (n+1) 位自守数之间的关系。
for n in range(1,10000):
# 求数的长度
k=len(str(n))
# 计算数的后几位
t=(n*n) % (10**k)
if t==n:
print(n)
猜数大师
题目描述:
电脑能够随机地岀加減算式,并判断玩家回答的得数是否正确。
如果它出的是加法,则两个加数均是自然数且不能大于100;如果它出的是减法,则被减数和減数都要是自然数且小于100,同时被减数大于等于减数。
计算机会出5道题,之后由你来统计回答的正确次数。
关键:如何刻画计算机随机出加减法?
if random.randint(0, 1) == 0:
c = a + b
else:
b = random.randint(1, a) # 被减数大于减数
c = a - b
绘制图形
语雀内容
题目描述:
使用画笔工具绘制图形,画笔的颜色为蓝色,画笔粗细为2,图形由_8个_5边形组合而成,图形的中心点在坐标在舞台的正中心,五边形边长为100,程序运行之后开始运行。
import turtle
screen = turtle.Screen()
t = turtle.Turtle()
t.pensive (2)
t.pencolor("blue")
for _ in range(8):
for _ in range(5):
t.forward(100)
t.left(360/5)
t.left(360/8)
screen.mainloop()
夹数
如果num在一段数字范围内,则返回num;否则返回离这个范围最近的边界。
示例:
>>> clamp(2, 3, 10)
2
>>> clamp(7, 3, 10)
7
>>> clamp(15, 3, 10)
10
解答:
def clamp_num(num, a, b):
return max(min(num, max(a, b)), min(a, b))
输入转数组
num = int(input())
l = list(map(lambda x:int(x),input().split(' ')))
print(max(l))
print(min(l))
print(sum(l))
字符转ASCII码
使用 chr()
函数。
>>> chr(65)
'A'
字符串列表中元素合并
result = ''.join(a)
例如:
for i in range(m):
tstr.append(chr(i+65))
result = ''.join(tstr)
获得列表最大值的下标
def max_idx(arr):
return arr.index(max(arr))
试题 基础练习 字母图形
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
数据规模与约定:
1 <= n, m <= 26。
l = list(map(lambda x:int(x),input().split(' ')))
n = l[0]
m = l[1]
all_str = []
for i in range(26):
all_str.append(chr(i+65))
for i in range(26):
all_str.append(chr(i+65))
res = {}
delta = 1
for i in range(n):
res[i] = all_str[0:m]
print(''.join(res[i]))
all_str.insert(0, all_str[delta+i])
all_str.pop()
delta+=1
计算年龄
张三、李四、王五、刘六的年龄是等差数列,他们四人的年龄相加是26,相乘是880。求以他们年龄为前4项的等差数列的前20项。
分析:这个题非常简单,遍历即可。设首个人年龄为 a,增量为 x,则核心是判断 a 和 x 的范围。
也就是判断出:a 的范围是[1, 4], x 的范围是[1, 6]
不然会把负数也算进来,虽然这个题很容易检查出来,但数据大了之后可能就不好检查了。因此一定要注意变量的范围!
for a in range(1, 4):
for x in range(1, 6):
if a*(a+x)*(a+2*x)*(26-3*a-3*x)==880:
print(a, a+x, a+2*x, a+3*x)
金蝉素数
由1, 3, 5, 7, 9排列而成的五位素数,同时去掉最高位与最低位后的3位数是素数;同时去掉高二位与低二位后的1位数也是素数。求这些“金蝉素数”可能的解。
三步走:
- 生成1、3、5、7、9的全排列,每种排列的结果为一个元组
- 将元组转换为数字
- 判断是否为素数 ```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)
<a name="qzDKd"></a>
## 小孩和饼干
问题描述:假设你是一位家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个**胃口值 gi **,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j 都有一个尺寸 sj 。**如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。**你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
```python
# 胃口是g,饼干尺寸是s
def findbis(g, s):
g.sort()
s.sort()
child = 0
biscuit = 0
while child<len(g) and biscuit < len(s):
if g[child]<=s[biscuit]:
child += 1
biscuit+=1
return child
g = [1, 1, 6]
s = [1, 2, 5]
x = findbis(g, s)
print(x)
JewelsInStones
# 查找J中的每个字符在S出现的次数的总和
# Input: J="aA", S="aAAbbbb"
# Output: 3
def count_J_in_S(J, S):
tempdict = {i: S.count(i) for i in set(S)}
return sum(tempdict.get(i, 0) for i in set(J))
j = input("请输入J:")
s = input("请输入S:")
print("结果为:", count_J_in_S(j, s))
对字典的使用,包括使用i: S.count(i)
统计每个键及其出现的次数;get(i, 0)
后的0是指设定默认值为0
找到第一个不重复字符
给定一个字符串,找到第一个不重复的字符,输出索引,如不存在输出 -1。
示例:
s = "loveleetcode"
return 2
s = "leetcode"
return 0
s = "aa"
return -1
代码:
def findUnique(s):
temp = {}
for i in s:
try:
temp[i] += 1
except:
temp[i] = 1
for idx, j in enumerate(s):
if(temp[j]==1):
return idx
return -1
s = input("Please input a string:")
a = findUnique(s)
print(a)
注意:这里使用了try...except...
的方法获取字符串每个字母及其出现次数的字典。这实际上是简化的 if...else...
好处是这是按顺序排列的。
如果按照temp = {i:s.count(i) for i in s}
,则结果将是乱序的。
注意这里对enumerate
的使用。
还有更好用的方法,是使用自带的 Counter
,这样就不需要 for 循环里套 try…except了:
import collections
temp = collections.Counter(s)