Skip to content
课程资料归档 · 2024 / 2025 秋季学期。历史安排与截止日期仅供查阅。

题集链接

OpenJudge/计算概论C(py)/2025-计算概论C-py作业4

01:数列求和

题目描述

对数列进行求和。给定一个整数 n,当 n 为偶数时,计算 1/2 + 1/4 + ...... + 1/n 的和;当 n 为奇数时,计算 1/1 + 1/3 + ...... + 1/n 的和。

要求使用函数实现。

输入 一个整数 n ($ 0 < n \le 1000 $) 输出 一个浮点数表示数列的和,保留 6 位小数

题解

思路

知识点

函数的定义与调用第4章函数
函数的参数第4章函数
函数的返回值第4章函数

代码

01:数列求和

python
def seriesSum(n):
    sumV = 0
    # 倒序遍历求和,设置步长为 -2,无须判断 n 的奇偶性
    for i in range(n, 0, -2):
        sumV += 1 / i
    return sumV


n = int(input())
sumV = seriesSum(n)
print(f'{sumV:.6f}')

02:删除子串

题目描述

有两个非空字符串,一个长的字符串,一个短的字符串。现在要在长串中查找并删除短串,打印处理后的结果。一个额外的参数表示全部删除子串或者至多删除一次。查找时从左到右查找,找到的子串不允许重叠(参见样例3)。

要求使用函数实现。

输入 输入只有一行,共三项,用空格隔开。前两个是字符串,分别是长字符串和短字符串。前者长度大于等于后者的长度,且字符串中不包含空白符。还有一个整数 n,取值为 0 或 1,0 表示至多删除一次,1 表示全部删除。 输出 如果短串包含在长串中,则打印处理后的字符串,否则打印 "Fail to delete"

题解

思路

知识点

程序的分支结构第3章程序控制结构
函数的定义与调用第4章函数

代码

02:删除子串

python
def strFindDel(s, t, n):
    if t in s:
        if n == 0:
            '''
            OJ 平台的 Python 解释器版本为 3.8,不能写
            return s.replace(t, '', __count=1),
            Python 3.12 开始支持这种写法
            '''
            '''
            最后的数字表示替换前多少个,不给出最后的数字
            或者给出 -1 表示替换所有
            '''
            return s.replace(t, '', 1)
        else:
            return s.replace(t, '')
    else:
        return 'Fail to delete'


s, t, n = input().split()
n = int(n)
print(strFindDel(s, t, n))

03:机器猜数

题目描述

随机选择 1 ~100 的一个整数 n,通过某种规则判断这个数 n 是多少。

规则如下:给定当前的数字范围[a, b],选择其中间的数 m=(a+b)/2,判断 m 和 n 的大小关系。如果 m = n,则表示猜对了,如果 m > n,则在 [a, m-1] 中继续判断,如果 m < n,则在 [m+1, b] 中继续判断。如果数字范围 [a, b] 的中间数 m 不是整数,则向上取整,例如 [1, 4],则 m = 3。如果数字范围满足 a = b,那么数 n 一定满足 n = a = b,此时不需要继续猜数。

初始的数字范围是 [1, 100]。现在有一个猜数机器,按照上述的规则进行猜数,那么这个猜数机器需要猜几次?

输入 一个整数,范围是 1 ~ 100(包含1和100) 输出 一个整数,表示按照题目的规则猜数,猜对结果时总共猜数的次数。

题解

思路

知识点

程序的循环结构第3章程序控制结构

代码

03:机器猜数

python
n = int(input())
l = 1
r = 100
cnt = 0
# 根据题意,当 l == r 时,此时 n == l == r,不需要继续猜数
while l < r:
    # 先 +1 再 // 2,可以实现向上取整
    m = (l + r + 1) // 2
    cnt += 1
    if m == n:
        # 猜中直接输出结果并结束程序
        print(cnt)
        exit()
    elif m > n:
        r = m - 1
    else:
        l = m + 1
print(cnt)

04:自动判题

题目描述

自动判断一个简单的数学等式是否成立。这里的数学等式是两个数的四则运算(加,减,乘,除)。参与运算的数是浮点数,结果保留两位小数。

输入 一个等式。数字和运算符之间没有空格。等式左边的两个数是非负数,右边的结果仅仅保留两位小数。 输出 一个字符串,true 或者 false

题解

思路

知识点

字符串类型第2章基本数据类型

代码

04:自动判题 Solution 1

python
# Solution 1
import math

# 按 '=' 分割输入的表达式和结果
exp, res = input().split('=')
res = float(res)
# 用 eval() 函数计算表达式的值
ans = float(eval(exp))
# 用 round() 函数将计算结果保留两位小数
ans = round(ans, 2)
# 由于浮点数存储精度问题,不能使用 '==' 判断两个浮点数是否相等
# 使用 math.isclose() 函数判断计算结果是否与给定结果在指定精度内相等
if math.isclose(ans, res):
    print('true')
else:
    print('false')

04:自动判题 Solution 2

python
# Solution 2
import math

# 按 '=' 分割输入的表达式和结果
exp, res = input().split('=')
res = float(res)
# 如果表达式以 '-' 开头,则将第一个数字设为负数
isNegative = False
if exp[0] == '-':
    isNegative = True
    # 先去除开始的 '-' 号,防止后续对操作符的判断产生影响
    exp = exp[1:]
# 按 '+'、'-'、'*'、'/' 分割表达式,获取操作符和操作数
a, b, op = None, None, None
for c in '+-*/':
    if c in exp:
        a, b = map(float, exp.split(c))
        op = c
        break
# 如果原表达式最开始有 '-' 号,则将第一个数设为负数
if isNegative:
    a = -a
# 根据操作符计算结果
ans = None
if op == '+':
    ans = a + b
elif op == '-':
    ans = a - b
elif op == '*':
    ans = a * b
elif op == '/':
    ans = a / b
# 用 round() 函数将计算结果保留两位小数
ans = round(ans, 2)
# 由于浮点数存储精度问题,不能使用 '==' 判断两个浮点数是否相等
# 使用 math.isclose() 函数判断计算结果是否与给定结果在指定精度内相等
if math.isclose(ans, res):
    print('true')
else:
    print('false')

04:自动判题 Solution 3

python
# Solution 3
import re
import math

a, b, op, res = None, None, None, None
# 用正则表达式获取操作符、操作数和计算结果
match = re.match(r'^(-?\d+(?:\.\d+)?)([+\-*/])(\d+(?:\.\d+)?)=(-?\d+(?:\.\d+)?)$', input())
if match:
    a, op, b, res = match.groups()
    a, b, res = float(a), float(b), float(res)
# 根据操作符计算结果
ans = None
if op == '+':
    ans = a + b
elif op == '-':
    ans = a - b
elif op == '*':
    ans = a * b
elif op == '/':
    ans = a / b
# 用 round() 函数将计算结果保留两位小数
ans = round(ans, 2)
# 由于浮点数存储精度问题,不能使用 '==' 判断两个浮点数是否相等
# 使用 math.isclose() 函数判断计算结果是否与给定结果在指定精度内相等
if math.isclose(ans, res):
    print('true')
else:
    print('false')

05:凯撒密码

题目描述

对字母和数字进行加密和解密。密钥是一个数字,用于加密和解密。

要求使用函数实现。

输入 输入有三行,每行一项,分别是模式、密钥、需要处理的信息。 第一行为模式,可能是 e, E, encrypt, Encrypt (这四个表示加密), d, D, decrypt, Decrypt (这四个表示解密), 或者是其他字符串。 第二行为密钥,是一个大于 0 且小于等于 26 的整数。 第三行为需要处理的信息,是一个字符串。 输出 如果模式表示加密或解密,则输出一个字符串,表示加密信息或解密信息。 如果模式既不是加密或解密,那么不论密钥和需要处理的信息是什么,都输出 "Wrong Mode"。

题解

思路

知识点

分支结构第3章程序的控制结构
函数的定义与调用第4章函数

代码

05:凯撒密码

python
def transform(c, key, base, round_len):
    """
    Python 中字符用 Unicode编码表示
    用 ord() 函数获取字符的 Unicode 编码
    用 chr() 函数获取 Unicode 编码对应的字符
    '0-9' 的 Unicode 编码范围是 48-57
    'A-Z' 的 Unicode 编码范围是 65-90
    'a-z' 的 Unicode 编码范围是 97-122
    """
    base = ord(base)
    offset = ord(c) - base
    new_offset = (offset + key) % round_len
    return chr(base + new_offset)


mode = input()
# 不是加密或解密的情况
if mode not in ['e', 'E', 'encrypt', 'Encrypt', 'd', 'D', 'decrypt', 'Decrypt']:
    print('Wrong Mode')
    exit()
key = int(input())
# 解密相当于加密的逆运算,把 key 取负就能统一运算
if mode in ['d', 'D', 'decrypt', 'Decrypt']:
    key = -key
msg = input()
ans = []
for i in range(len(msg)):
    if msg[i].isupper():
        ans.append(transform(msg[i], key, 'A', 26))
    elif msg[i].islower():
        ans.append(transform(msg[i], key, 'a', 26))
    elif msg[i].isdigit():
        ans.append(transform(msg[i], key, '0', 10))
    else:
        ans.append(msg[i])
print(''.join(ans))

贡献者:徐志衡 上次修改:2025/10/30


课程资料由授课教师、助教与同学共同积累。