✏️ 习题

第 4 章 · 循环结构 · 共 56 题 · 分 6 页 · 由易到难

答案默认折叠,点击题目或右侧开关控制显示
展开所有答案
1
输出 100 以内的所有偶数,每行输出 8 个数。
▶ 运行结果: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100
参考答案
python
count = 0
for i in range(0, 101, 2):
    print(f"{i:4d}", end=" ")
    count += 1
    if count % 8 == 0:
        print()
2
输出 100~200 之间不能被 3 整除的数,每行输出 8 个。
▶ 运行结果: 100 101 103 104 106 107 109 110 112 113 115 116 118 119 121 122 124 125 127 128 130 131 133 134 136 137 139 140 142 143 145 146 148 149 151 152 154 155 157 158 160 161 163 164 166 167 169 170 172 173 175 176 178 179 181 182 184 185 187 188 190 191 193 194 196 197 199 200
参考答案
python
count = 0
for i in range(100, 201):
    if i % 3 != 0:
        print(f"{i:4d}", end=" ")
        count += 1
        if count % 8 == 0:
            print()
3
找出 2000~3200 之间能被 7 整除但不是 5 的倍数的数,每行输出 8 个。
▶ 运行结果: 2002 2009 2016 2023 2037 2044 2051 2058 2072 2079 2086 2093 2107 2114 2121 2128 2142 2149 2156 2163 2177 2184 2191 2198 2212 2219 2226 2233 2247 2254 2261 2268 2282 2289 2296 2303 2317 2324 2331 2338 2352 2359 2366 2373 2387 2394 2401 2408 2422 2429 2436 2443 2457 2464 2471 2478 2492 2499 2506 2513 2527 2534 2541 2548 2562 2569 2576 2583 2597 2604 2611 2618 2632 2639 2646 2653 2667 2674 2681 2688 2702 2709 2716 2723 2737 2744 2751 2758 2772 2779 2786 2793 2807 2814 2821 2828 2842 2849 2856 2863 2877 2884 2891 2898 2912 2919 2926 2933 2947 2954 2961 2968 ... (输出过长,已截断)
参考答案
python
count = 0
for i in range(2000, 3201):
    if i % 7 == 0 and i % 5 != 0:
        print(f"{i:6d}", end=" ")
        count += 1
        if count % 8 == 0:
            print()
4
计算 100 以内所有奇数之和。
▶ 运行结果: 100以内的奇数之和:2500
参考答案
python
total = 0
for i in range(1, 100, 2):
    total += i
print(f"100以内的奇数之和:{total}")  # 2500
5
计算调和级数 s = 1 + 1/2 + 1/3 + ... + 1/n,n 由用户输入。
📝 样例输入: 5
▶ 运行结果: 请输入 n:5 1 + 1/2 + ... + 1/5 = 2.283333
参考答案
python
n = int(input("请输入 n:"))
s = 0
for i in range(1, n + 1):
    s += 1 / i
print(f"1 + 1/2 + ... + 1/{n} = {s:.6f}")
6
1 + 3 + 5 + 7 + 9 + ...,找出和小于等于 500 的最大项数。
▶ 运行结果: 最大项数对应的和:484,下一项为45
参考答案
python
s = 0
n = 1
while s + n <= 500:
    s += n
    n += 2
print(f"最大项数对应的和:{s},下一项为{n}")  # s=441, n=43
7
计算交错级数 s = 1 - 1/2 + 1/3 - 1/4 + ... - 1/20
▶ 运行结果: 1 - 1/2 + 1/3 - ... - 1/20 = 0.668771
参考答案
python
s = 0
for i in range(1, 21):
    if i % 2 == 1:
        s += 1 / i
    else:
        s -= 1 / i
print(f"1 - 1/2 + 1/3 - ... - 1/20 = {s:.6f}")
8
堆叠相加:输入数字 a 和组数 n,计算 a + aa + aaa + ...(共 n 项)。
📝 样例输入: 3 4
▶ 运行结果: 请输入 a:3 请输入 n:4 3702
参考答案
python
a = int(input("请输入 a:"))
n = int(input("请输入 n:"))
s = 0
x = 0
for i in range(n):
    x = x * 10 + a
    s += x
print(s)
9
用户输入一个整数(可为负数),判断该数字是几位数。
📝 样例输入: -12345
▶ 运行结果: 请输入一个整数:-12345 5 位数
参考答案
python
n = int(input("请输入一个整数:"))
num = abs(n)
if num == 0:
    print("1 位数")
else:
    count = 0
    while num > 0:
        num //= 10
        count += 1
    print(f"{count} 位数")
10
搭建金字塔:n 层金字塔从底向上每层依次需要 n², (n-1)², ..., 1 块石块。求总共需要多少块?
📝 样例输入: 3
▶ 运行结果: 请输入金字塔的层数:3 搭建金字塔需要 14 块石块
参考答案
python
n = int(input("请输入金字塔的层数:"))
s = 0
for i in range(n + 1):
    s += i * i
print(f"搭建金字塔需要 {s} 块石块")
11
输入一行字符(含数字、字母、符号),只保留并输出其中的数字。
📝 样例输入: abc123def456
▶ 运行结果: 请输入一行字符:abc123def456 数字字符:123456
参考答案
python
s = input("请输入一行字符:")
result = ""
for ch in s:
    if ch.isdigit():
        result += ch
print(f"数字字符:{result}")
12
输入一行字符,分别统计其中英文字母、空格、数字和其它字符的个数。
📝 样例输入: Hello World 123!
▶ 运行结果: 请输入一行字符:Hello World 123! 字母:10,空格:2,数字:3,其它:1
参考答案
python
s = input("请输入一行字符:")
letters = spaces = digits = others = 0
for ch in s:
    if ch.isalpha():
        letters += 1
    elif ch.isspace():
        spaces += 1
    elif ch.isdigit():
        digits += 1
    else:
        others += 1
print(f"字母:{letters},空格:{spaces},数字:{digits},其它:{others}")
13
输出斐波那契数列的前 n 项,n 由用户输入。(1, 1, 2, 3, 5, 8, 13, ...)
📝 样例输入: 8
▶ 运行结果: 请输入 n:8 1 1 2 3 5 8 13 21
参考答案
python
n = int(input("请输入 n:"))
a, b = 1, 1
for i in range(n):
    print(a, end=" ")
    a, b = b, a + b
14
计算斐波那契数列前 n 项的和。
📝 样例输入: 8
▶ 运行结果: 请输入 n:8 前 8 项之和:54
参考答案
python
n = int(input("请输入 n:"))
a, b = 1, 1
total = 0
for i in range(n):
    total += a
    a, b = b, a + b
print(f"前 {n} 项之和:{total}")
15
有一分数序列 2/1, 3/2, 5/3, 8/5, 13/8, ...,求前 20 项之和。
▶ 运行结果: 前 20 项之和:32.66026079864164
参考答案
python
a, b = 1, 2
s = b / a
for i in range(1, 20):
    a, b = b, a + b
    s += b / a
print(f"前 20 项之和:{s}")  # 32.66
16
大衍数列:0, 2, 4, 8, 12, 18, 24, 32, 40, 50, ... 偶数项为序号平方除以 2,奇数项为序号平方减 1 除以 2。打印前 100 项。
▶ 运行结果: 0 2 4 8 12 18 24 32 40 50 60 72 84 98 112 128 144 162 180 200 220 242 264 288 312 338 364 392 420 450 480 512 544 578 612 648 684 722 760 800 840 882 924 968 1012 1058 1104 1152 1200 1250 1300 1352 1404 1458 1512 1568 1624 1682 1740 1800 1860 1922 1984 2048 2112 2178 2244 2312 2380 2450 2520 2592 2664 2738 2812 2888 2964 3042 3120 3200 3280 3362 3444 3528 3612 3698 3784 3872 3960 4050 4140 4232 4324 4418 4512 4608 4704 4802 4900 5000
参考答案
python
for x in range(1, 101):
    if x % 2 == 0:
        a = x ** 2 // 2
    else:
        a = (x ** 2 - 1) // 2
    print(f"{a:6d}", end=" ")
    if x % 10 == 0:
        print()
17
构造 n 行 m 列的等差矩阵,第 i 行第 j 列填入 i×j。
📝 样例输入: 3 4
▶ 运行结果: 请输入 n m:3 4 1 2 3 4 2 4 6 8 3 6 9 12
参考答案
python
n, m = map(int, input("请输入 n m:").split())
for i in range(1, n + 1):
    for j in range(1, m + 1):
        print(i * j, end=" ")
    print()
18
求两个正整数的最小公倍数(LCM)。
📝 样例输入: 20 36
▶ 运行结果: m = 20 n = 36 最小公倍数:180
参考答案
python
m = int(input("m = "))
n = int(input("n = "))
i = max(m, n)
while True:
    if i % m == 0 and i % n == 0:
        print(f"最小公倍数:{i}")
        break
    i += 1
19
有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?
▶ 运行结果: 123 124 132 134 142 143 213 214 231 234 241 243 312 314 321 324 341 342 412 413 421 423 431 432 共有:24 个
参考答案
python
count = 0
for i in range(1, 5):
    for j in range(1, 5):
        for k in range(1, 5):
            if i != k and i != j and j != k:
                count += 1
                print(f"{i}{j}{k}", end=" ")
                if count % 8 == 0:
                    print()
print(f"\n共有:{count} 个")  # 24
20
输出右对齐直角三角形:
    *
***
*****
*******

📝 样例输入: 4
▶ 运行结果: 请输入行数:4 * *** ***** *******
参考答案
python
n = int(input("请输入行数:"))
for i in range(1, n + 1):
    print(' ' * 2 * (n - i), end='')
    print('*' * (i * 2 - 1))
21
输入一个正整数,输出它的所有约数。
📝 样例输入: 12
▶ 运行结果: 请输入一个正整数:12 1 2 3 4 6 12
参考答案
python
n = int(input("请输入一个正整数:"))
for i in range(1, n + 1):
    if n % i == 0:
        print(i, end=" ")
22
输出所有三位水仙花数(各位数字的立方和等于该数本身,如 153 = 1³ + 5³ + 3³)。
▶ 运行结果: 153 370 371 407
参考答案
python
for n in range(100, 1000):
    hun = n // 100
    ten = n // 10 % 10
    ind = n % 10
    if hun ** 3 + ten ** 3 + ind ** 3 == n:
        print(n, end=" ")
# 153 370 371 407
23
找出所有四叶玫瑰数(四位数的各位数字的 4 次方之和等于它本身)。
▶ 运行结果: 1634 是四叶玫瑰数 8208 是四叶玫瑰数 9474 是四叶玫瑰数
参考答案
python
for i in range(1000, 10000):
    a = i // 1000
    b = i // 100 % 10
    c = i // 10 % 10
    d = i % 10
    if a**4 + b**4 + c**4 + d**4 == i:
        print(f"{i} 是四叶玫瑰数")
# 1634 8208 9474
24
输入 start 和 end,输出区间内的所有阿姆斯特朗数(n 位数的各位数字的 n 次方和等于它本身)。
📝 样例输入: 1 500
▶ 运行结果: start:1 end:500 1 2 3 4 5 6 7 8 9 153 370 371 407
参考答案
python
start = int(input("start:"))
end = int(input("end:"))
for num in range(start, end + 1):
    s = str(num)
    n = len(s)
    if sum(int(d) ** n for d in s) == num:
        print(num)
25
输入一个整数(可含负数),判断是否为回文数。
📝 样例输入: 121
▶ 运行结果: 请输入一个整数:121 121 是回文数
参考答案
python
num = int(input("请输入一个整数:"))
n = abs(num)
r = 0
while n > 0:
    r = r * 10 + n % 10
    n //= 10
if num == r:
    print(f"{num} 是回文数")
else:
    print(f"{num} 不是回文数")
26
输入一个正整数,将其分解为质因数的乘积。
📝 样例输入: 12
▶ 运行结果: 请输入一个正整数:12 12 = 2 × 2 × 3
参考答案
python
num = int(input("请输入一个正整数:"))
n = num
factors = []
i = 2
while num != 1:
    while num % i == 0:
        factors.append(i)
        num //= i
    i += 1
if len(factors) < 2:
    factors.insert(0, 1)
print(f"{n} =", " × ".join(map(str, factors)))
27
找出 1000 以内的所有完全数(等于其所有真因子之和,如 6 = 1+2+3)。
▶ 运行结果: 6 是完全数 28 是完全数 496 是完全数
参考答案
python
for i in range(2, 1001):
    s = 0
    for j in range(1, i):
        if i % j == 0:
            s += j
    if s == i:
        print(f"{i} 是完全数")
# 6 28 496
28
求 x 的 y 次方的最后三位数。
📝 样例输入: 13 13
▶ 运行结果: x = 13 y = 13 13的13次方的后三位为:253
参考答案
python
x = int(input("x = "))
y = int(input("y = "))
last = 1
for i in range(y):
    last = last * x % 1000  # 只保留后三位
print(f"{x}的{y}次方的后三位为:{last}")
29
自守数:一个数的平方的尾数等于该数本身(如 5²=25, 76²=5776)。求 100000 以内的自守数。
▶ 运行结果: 0 1 5 6 25 76 376 625 9376 90625
参考答案
python
for n in range(100000):
    s = n * n
    if str(s).endswith(str(n)):
        print(n, end="  ")
# 0 1 5 6 25 76 376 625 9376
30
已知正整数 n 是两个不同质数的乘积,求较大的那个质数。
📝 样例输入: 15
▶ 运行结果: 请输入 n:15 5
参考答案
python
n = int(input("请输入 n:"))
for i in range(2, int(n ** 0.5) + 1):
    if n % i == 0:
        print(n // i)  # 较大的质数
        break
31
输出所有 4 位数的可逆素数(素数反转后仍为素数,如 1031 反转 1301)。
▶ 运行结果: 1009---9001 1021---1201 1031---1301 1033---3301 1061---1601 1069---9601 1091---1901 1097---7901 1103---3011 1109---9011 1151---1511 1153---3511 1181---1811 1193---3911 1201---1021 1213---3121 1217---7121 1223---3221 1229---9221 1231---1321 1237---7321 1249---9421 1259---9521 1279---9721 1283---3821 1301---1031 1321---1231 1381---1831 1399---9931 1409---9041 1429---9241 1439---9341 1453---3541 1471---1741 1487---7841 1499---9941 1511---1151 1523---3251 1559---9551 1583---3851 1597---7951 1601---1061 1619---9161 1657---7561 1669---9661 1723---3271 1733---3371 1741---1471 1753---3571 1789---9871 1811---1181 1831---1381 1847---7481 1867---7681 1879---9781 1901---1091 1913---3191 1933---3391 1949---9491 1979---9791 3011---1103 3019--- ... (输出过长,已截断)
参考答案
python
for n in range(1000, 10000):
    is_prime = True
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            is_prime = False
            break
    if not is_prime:
        continue
    rev = int(str(n)[::-1])
    for i in range(2, int(rev**0.5)+1):
        if rev % i == 0:
            is_prime = False
            break
    if is_prime:
        print(f"{n}---{rev}", end="  ")
32
求 3~1000 以内的所有孪生素数(间隔为 2 的相邻素数,如 3 和 5)。
▶ 运行结果: (3,5) (5,7) (11,13) (17,19) (29,31) (41,43) (59,61) (71,73) (101,103) (107,109) (137,139) (149,151) (179,181) (191,193) (197,199) (227,229) (239,241) (269,271) (281,283) (311,313) (347,349) (419,421) (431,433) (461,463) (521,523) (569,571) (599,601) (617,619) (641,643) (659,661) (809,811) (821,823) (827,829) (857,859) (881,883)
参考答案
python
for p in range(3, 999):
    is_p = True
    for i in range(2, int(p**0.5)+1):
        if p % i == 0:
            is_p = False
            break
    if not is_p:
        continue
    p2 = p + 2
    is_p2 = True
    for i in range(2, int(p2**0.5)+1):
        if p2 % i == 0:
            is_p2 = False
            break
    if is_p2 and p2 <= 1000:
        print(f"({p},{p2})", end="  ")
33
梅森素数:形如 2ⁿ-1 的素数(n 也为素数)。求 n<20 的所有梅森素数。
▶ 运行结果: 3 = 2^2-1 7 = 2^3-1 31 = 2^5-1 127 = 2^7-1 8191 = 2^13-1 131071 = 2^17-1 524287 = 2^19-1
参考答案
python
for n in range(2, 20):
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            break
    else:
        k = 2**n - 1
        for j in range(2, int(k**0.5)+1):
            if k % j == 0:
                break
        else:
            print(f"{k} = 2^{n}-1")
34
亲密数:A 的真因子之和等于 B,B 的真因子之和等于 A。求 3000 以内的亲密数。
▶ 运行结果: (220, 284), (1184, 1210), (2620, 2924),
参考答案
python
for a in range(1, 3000):
    b = sum(i for i in range(1, a//2+1) if a%i==0)
    n = sum(j for j in range(1, b//2+1) if b%j==0)
    if n == a and a < b:
        print(f"({a}, {b})", end=", ")
# (220, 284), (1184, 1210), (2620, 2924)
35
三位黑洞数:任何三位数经有限次"重排求差"(最大排列减最小排列)后必得到 495。验证并输出 495。
📝 样例输入: 123
▶ 运行结果: 请输入一个三位数:123 321 - 123 = 198 981 - 189 = 792 972 - 279 = 693 963 - 369 = 594 954 - 459 = 495 954 - 459 = 495 黑洞数:495
参考答案
python
num = int(input("请输入一个三位数:"))
while True:
    s = str(num)
    mx = int(''.join(sorted(s, reverse=True)))
    mn = int(''.join(sorted(s)))
    new = mx - mn
    print(f"{mx} - {mn} = {new}")
    if new == num:
        print(f"黑洞数:{new}")
        break
    num = new
36
回文素数:既是回文数又是素数。求 1000 以内的所有回文素数。
▶ 运行结果: 2 3 5 7 11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929
参考答案
python
for n in range(2, 1001):
    # 判断素数
    is_prime = True
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            is_prime = False
            break
    if not is_prime:
        continue
    # 判断回文
    if str(n) == str(n)[::-1]:
        print(n, end=" ")
# 2 3 5 7 11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929
37
输入 start 和 end,输出区间内的所有回文数。
📝 样例输入: 1 500
▶ 运行结果: start:1 end:500 1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99 101 111 121 131 141 151 161 171 181 191 202 212 222 232 242 252 262 272 282 292 303 313 323 333 343 353 363 373 383 393 404 414 424 434 444 454 464 474 484 494
参考答案
python
start = int(input("start:"))
end = int(input("end:"))
for n in range(start, end + 1):
    if str(n) == str(n)[::-1]:
        print(n, end=" ")
38
输入一个十进制整数,手动实现转二进制(禁用 bin())。
📝 样例输入: 25
▶ 运行结果: 请输入一个十进制整数:25 二进制:11001
参考答案
python
num = int(input("请输入一个十进制整数:"))
n = abs(num)
binary = ""
if n == 0:
    binary = "0"
else:
    while n > 0:
        binary = str(n % 2) + binary
        n //= 2
if num < 0:
    binary = "-" + binary
print(f"二进制:{binary}")
39
输入一个二进制整数,手动实现转十进制(禁用 int())。
📝 样例输入: 1101
▶ 运行结果: 请输入一个二进制数:1101 十进制:13
参考答案
python
binary = input("请输入一个二进制数:")
decimal = 0
for char in binary:
    digit = 1 if char == '1' else 0
    decimal = decimal * 2 + digit
print(f"十进制:{decimal}")
40
通用数制转换:输入十进制数和目标进制(2~16),手动实现转换(禁用 bin()/hex() 等)。
📝 样例输入: 255 16
▶ 运行结果: 请输入十进制数:255 请输入目标进制(2-16):16 16进制:FF
参考答案
python
num = int(input("请输入十进制数:"))
base = int(input("请输入目标进制(2-16):"))
digits = "0123456789ABCDEF"
n = abs(num)
result = ""
while n > 0:
    result = digits[n % base] + result
    n //= base
result = result if num >= 0 else "-" + result
print(f"{base}进制:{result}")
41
两个妹妹的年龄之积是年龄之和的 6 倍,且年龄差不超过 8 岁。求她们的年龄。
▶ 运行结果: 年龄:15 和 10
参考答案
python
for i in range(1, 100):
    for j in range(1, i):
        if i * j == 6 * (i + j) and i - j < 8:
            print(f"年龄:{i} 和 {j}")
# 15 和 10
42
车牌前两位数字相同,后两位数字相同且与前两位不同,4 位车牌是一个整数的平方。求车牌号。
▶ 运行结果: 车牌号:7744
参考答案
python
for i in range(10):
    for j in range(10):
        if i != j:
            k = 1100 * i + 11 * j
            for t in range(32, 100):
                if t * t == k:
                    print(f"车牌号:{k}")
# 7744
43
口袋中有 12 个球:3 红、3 白、6 黑。任取 8 个,共有多少种颜色搭配?
▶ 运行结果: 1: 红0 白2 黑6 2: 红0 白3 黑5 3: 红1 白1 黑6 4: 红1 白2 黑5 5: 红1 白3 黑4 6: 红2 白0 黑6 7: 红2 白1 黑5 8: 红2 白2 黑4 9: 红2 白3 黑3 10: 红3 白0 黑5 11: 红3 白1 黑4 12: 红3 白2 黑3 13: 红3 白3 黑2 共 13 种
参考答案
python
num = 0
for r in range(0, 4):       # 红球 0~3
    for w in range(0, 4):   # 白球 0~3
        if 8 - r - w <= 6:  # 黑球不超过 6
            num += 1
            print(f"{num}: 红{r} 白{w} 黑{8-r-w}")
print(f"共 {num} 种")
44
30 人吃饭花 50 先令,男人 3 先令/人,女人 2 先令/人,小孩 1 先令/人。求各几人。
▶ 运行结果: 男人1,女人18,小孩11 男人2,女人16,小孩12 男人3,女人14,小孩13 男人4,女人12,小孩14 男人5,女人10,小孩15 男人6,女人8,小孩16 男人7,女人6,小孩17 男人8,女人4,小孩18 男人9,女人2,小孩19
参考答案
python
for x in range(1, 11):      # 男人
    y = 20 - 2 * x           # 由方程推导
    z = 30 - x - y
    if y > 0 and z > 0 and 3*x + 2*y + z == 50:
        print(f"男人{x},女人{y},小孩{z}")
45
爱因斯坦的阶梯:每步跨 2 阶剩 1 阶,跨 3 阶剩 2 阶,跨 5 阶剩 4 阶,跨 6 阶剩 5 阶,跨 7 阶正好不剩。求 1~n 内满足条件的数。
📝 样例输入: 1000
▶ 运行结果: 请输入 n:1000 119 329 539 749 959
参考答案
python
n = int(input("请输入 n:"))
for i in range(7, n + 1):
    if i % 7 == 0 and i % 6 == 5 and i % 5 == 4 and i % 3 == 2:
        print(i)
# 119 329 539 749 959 ...
46
将 5 元兑换成 1 元、5 角、1 角的硬币,共有多少种兑换方法?
▶ 运行结果: 共有 36 种兑换方法
参考答案
python
count = 0
# 5元=50角,1元=10角,5角=5角
for x in range(0, 51, 10):      # 1元
    for y in range(0, 51 - x, 5):  # 5角
        z = 50 - x - y             # 1角
        if z >= 0:
            count += 1
print(f"共有 {count} 种兑换方法")
47
求 100 以内的所有勾股数(a² + b² = c² 的正整数组)。
▶ 运行结果: (3, 4, 5) (5, 12, 13) (6, 8, 10) (7, 24, 25) (8, 15, 17) (9, 12, 15) (9, 40, 41) (10, 24, 26) (11, 60, 61) (12, 16, 20) (12, 35, 37) (13, 84, 85) (14, 48, 50) (15, 20, 25) (15, 36, 39) (16, 30, 34) (16, 63, 65) (18, 24, 30) (18, 80, 82) (20, 21, 29) (20, 48, 52) (21, 28, 35) (21, 72, 75) (24, 32, 40) (24, 45, 51) (24, 70, 74) (25, 60, 65) (27, 36, 45) (28, 45, 53) (28, 96, 100) (30, 40, 50) (30, 72, 78) (32, 60, 68) (33, 44, 55) (33, 56, 65) (35, 84, 91) (36, 48, 60) (36, 77, 85) (39, 52, 65) (39, 80, 89) (40, 42, 58) (40, 75, 85) (42, 56, 70) (45, 60, 75) (48, 55, 73) (48, 64, 80) (51, 68, 85) (54, 72, 90) (57, 76, 95) (60, 63, 87) (60, 80, 100) (65, 72, 97)
参考答案
python
import math
for a in range(1, 101):
    for b in range(a + 1, 101):
        c = int(math.sqrt(a*a + b*b))
        if c*c == a*a + b*b and c <= 100:
            print(f"({a}, {b}, {c})", end="  ")
48
出售金鱼:分 5 次卖出,第 i 次卖出余下的 1/i 加 1/i 条,最后剩 11 条。求原来有多少条?
▶ 运行结果: 原来鱼缸中共有 59 条金鱼
参考答案
python
r = 11  # 最后剩余
for i in range(5, 1, -1):  # 从第5次倒推
    r = (r * i + 1) // (i - 1)
print(f"原来鱼缸中共有 {r} 条金鱼")  # 59
49
国王发金币:第 1 天 1 枚,第 2-3 天每天 2 枚,第 4-6 天每天 3 枚,第 7-10 天每天 4 枚……求前 k 天共获得多少金币。
📝 样例输入: 10
▶ 运行结果: 请输入天数 k:10 30
参考答案
python
k = int(input("请输入天数 k:"))
total = 0
days = 0
m = 1
while days + m <= k:
    total += m * m   # 该阶段每天 m 枚,共 m 天
    days += m
    m += 1
# 剩余天数
total += (k - days) * m
print(total)
50
10 位评委打分,去掉一个最高分和一个最低分,剩余 8 个分数的平均分为选手得分。
📝 样例输入: 90 92 85 88 95 78 92 87 90 93
▶ 运行结果: 第1位评委打分:90 第2位评委打分:92 第3位评委打分:85 第4位评委打分:88 第5位评委打分:95 第6位评委打分:78 第7位评委打分:92 第8位评委打分:87 第9位评委打分:90 第10位评委打分:93 选手得分:89.62
参考答案
python
scores = []
for i in range(10):
    s = float(input(f"第{i+1}位评委打分:"))
    scores.append(s)
total = sum(scores) - max(scores) - min(scores)
score = total / 8
print(f"选手得分:{score:.2f}")
51
优惠券叠加:券1满100减20,券2满200减50。可任意顺序使用,先用的券影响后用的券。求最低支付金额。
📝 样例输入: 370
▶ 运行结果: 请输入商品总价:370 300
参考答案
python
n = int(input("请输入商品总价:"))
# 方案1:不用券
p1 = n
# 方案2:仅用券1
p2 = n - 20 if n >= 100 else n
# 方案3:仅用券2
p3 = n - 50 if n >= 200 else n
# 方案4:先用券1再用券2
t = n - 20 if n >= 100 else n
p4 = t - 50 if t >= 200 else t
# 方案5:先用券2再用券1
t = n - 50 if n >= 200 else n
p5 = t - 20 if t >= 100 else t
print(min(p1, p2, p3, p4, p5))
52
兑换问题:买了 n 瓶水,每 k 个空瓶盖兑换 1 瓶。求最终一共能喝到多少瓶?
📝 样例输入: 10 3
▶ 运行结果: 购买瓶数:10 兑换所需瓶盖数:3 14
参考答案
python
n = int(input("购买瓶数:"))
k = int(input("兑换所需瓶盖数:"))
total = n
caps = n
while caps >= k:
    exchange = caps // k
    total += exchange
    caps = caps % k + exchange
print(total)
53
银行存款最优方案:2000 元存 20 年,有 1/2/3/5/8 年期限(月利率不同),求获利最多的存法。
▶ 运行结果: 8年×0 5年×4 3年×0 2年×0 1年×0 本利合计:8841.01
参考答案
python
max_val = 0
for x8 in range(0, 3):
    for x5 in range(0, (20-8*x8)//5 + 1):
        for x3 in range(0, (20-8*x8-5*x5)//3 + 1):
            for x2 in range(0, (20-8*x8-5*x5-3*x3)//2 + 1):
                x1 = 20-8*x8-5*x5-3*x3-2*x2
                r = 2000 * (1+0.0063*12)**x1 * (1+2*0.0066*12)**x2 \
                    * (1+3*0.0069*12)**x3 * (1+5*0.0075*12)**x5 \
                    * (1+8*0.0084*12)**x8
                if r > max_val:
                    max_val = r
                    b1, b2, b3, b5, b8 = x1, x2, x3, x5, x8
print(f"8年×{b8} 5年×{b5} 3年×{b3} 2年×{b2} 1年×{b1}")
print(f"本利合计:{max_val:.2f}")
54
输入一个真分数,将其分解为埃及分数(分子为 1 的分数之和)。
📝 样例输入: 8 11
▶ 运行结果: 分子:8 分母:11 8/11 = 1/2 + 1/5 + + 1/55 + 1/110
参考答案
python
a = int(input("分子:"))
b = int(input("分母:"))
print(f"{a}/{b} =", end=" ")
while a != 1:
    if b % a != 0:
        c = b // a + 1
    else:
        c = b // a
        a = 1
    print(f"1/{c}", end="")
    if a != 1:
        print(" + ", end="")
    a = a * c - b
    b = b * c
    if a == 3 and b % 2 == 0:
        print(f" + 1/{b//2} + 1/{b}")
        break
55
按递增顺序列出分母为 40、分子小于 40 的所有最简分数。
▶ 运行结果: 1/40 3/40 7/40 9/40 11/40 13/40 17/40 19/40 21/40 23/40 27/40 29/40 31/40 33/40 37/40 39/40
参考答案
python
for i in range(1, 40):
    # 求分子 i 和分母 40 的最大公约数
    a, b = 40, i
    while b != 0:
        a, b = b, a % b
    if a == 1:  # 最大公约数为1,是最简分数
        print(f"{i}/40", end="  ")
56
比较两个分数的大小(通分后比较分子)。
📝 样例输入: 7 12 5 7
▶ 运行结果: 第一个分数(分子 分母):7 12 第二个分数(分子 分母):5 7 7/12 < 5/7
参考答案
python
a, b = map(int, input("第一个分数(分子 分母):").split())
c, d = map(int, input("第二个分数(分子 分母):").split())
# 通分:交叉相乘比较
if a * d > c * b:
    print(f"{a}/{b} > {c}/{d}")
elif a * d == c * b:
    print(f"{a}/{b} = {c}/{d}")
else:
    print(f"{a}/{b} < {c}/{d}")