python第四次作业

1.给定一个包含n+1个整数的数组nums,其数字在1到n之间(包含1和n),

可知至少存在一个重复的整数 假设只有一个重复的整数,请找出这个重复的数 -- 可以使用多种方式 -异或运算/集合

代码:

python 复制代码
def find_repeated_num(nums):
    n = len(nums) - 1  # n+1个整数的数组nums,范围在1到n之间(包含1和n)
    xor_n = 0
    xor_nums = 0
    # 通过异或1到n中所有数
    for i in range(1, n+1):
        xor_n ^= i
    # 异或数组nums中所有元素
    for j in nums:
        xor_nums ^= j
    # 最终异或结果即为重复数
    return xor_n ^ xor_nums

# 测试
nums = [1,2,3,4,5,3,6,7]
print(find_repeated_num(nums))  # 3

运行结果:

2.编写一个登录功能,使用序列化完成,并使用装饰器完成用户名和密码的记录及每次登录时间

  • 1.存储文件中的用户名和密码,使用序列化的形式--对象

  • 2.读取文件中的数据-反序列化的对象,

  • 3.用户输入登录的账户和密码,检验,完成登录操作

  • 4.装饰器记录登录的账户和密码,及登录时间

代码:

python 复制代码
import pickle
import time

# 装饰器:记录登录时间、用户名、密码、结果
def login_log(func):
    def wrapper(user, pwd):
        # 登录时间
        log_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        # 执行原登录函数,获取结果
        res = func(user, pwd)
        # 追加写入日志
        with open("login_log.txt", "a", encoding="utf-8") as f:
            f.write(f"时间:{log_time},用户名:{user},密码:{pwd},结果:{res}\n")
        return res
    return wrapper

# 序列化/反序列化,读取/初始化用户数据
def get_users():
    try:
        # 反序列化:读取文件中的用户字典对象
        with open("user.pkl", "rb") as f:
            return pickle.load(f)
    except FileNotFoundError:
        # 首次运行无文件,手动输入初始用户信息
        print("=== 首次运行 ===")
        init_user = input("请设置初始用户名:").strip()
        init_pwd = input("请设置初始用户密码:").strip()
        # 构造用户对象并序列化存储
        init_obj = {init_user: init_pwd}
        with open("user.pkl", "wb") as f:
            pickle.dump(init_obj, f)
        print("用户数据初始化完成\n")
        return init_obj

# 登录函数
@login_log
def login(username, password):
    users = get_users()
    if username not in users:
        return "用户名不存在"
    elif users[username] == password:
        return "登录成功"
    else:
        return "密码错误"

# 主程序
if __name__ == "__main__":
    print("=== 系统登录 ===")
    uname = input("请输入用户名:").strip()
    pwd = input("请输入密码:").strip()
    print("登录结果:", login(uname, pwd))

运行结果:

3.测试位运算符,数字为23和-17的,并详细列出位运算的全过程

代码:

python 复制代码
a = 23
b = -17

"""
十进制转二进制转补码
    a:0001 0111 原
      0001 0111 补
    b:0001 0001 原
      1110 1110 反
      1110 1111 补  
"""

"""
位与
    a:0001 0111
    b:1110 1111
    &:0000 0111 补
      0000 0111 原 = 7
"""
print("a & b:", a & b)  # 7

"""
位或
    a:0001 0111
    b:1110 1111
    |:1111 1111 补
      1111 1110 反 
      0000 0001 原 = -1  
"""
print("a | b:", a | b)  # -1

"""
异或
    a:0001 0111
    b:1110 1111
    ^:1111 1000 
      1111 0111
      0000 1000 = -8
"""
print("a ^ b:", a ^ b)  # -8

"""
取反
    a:0001 0111
    ~:1110 1000 ==>反:1110 0111 ==>原 0001 1000 = -24
    b:1110 1111
    ~:0001 0000 ==> 16
"""
print("~a:", ~a)  # -24
print("~b:", ~b)  # 16

"""
左移
    a:0001 0111
    <<2:0101 1100 = 92
    b:1110 1111
    <<2:1011 1100 ==>反:1011 1011 ==>原 0100 0100 = -68
"""
print("a<<2:", a << 2)  # 92
print("b<<2:", b << 2)  # -68

"""
右移
    a:0001 0111
    >>2:0000 0101 = 5
    b:1110 1111
    >>2:1111 1011 ==>反:1111 1010 ==>原 0000 0101 = -5
"""
print("a>>2:", a >> 2)  # 5
print("b>>2:", b >> 2)  # -5

运行结果:

相关推荐
代码改善世界12 小时前
【数据结构与算法】栈和队列题解
数据结构
ShineWinsu12 小时前
对于C++:继承的解析—上
开发语言·数据结构·c++·算法·面试·笔试·继承
pp起床13 小时前
动态规划 | part05
算法·动态规划
GuangHeAI_ATing13 小时前
国密算法SSD怎么选?这3款国产固态硬盘安全又高速
算法
雨泪丶13 小时前
代码随想录算法训练营-Day34
算法
哈里谢顿13 小时前
Django 应用 OOM(Out of Memory)故障的定位思路和排查方法
python·django
Yzzz-F13 小时前
牛客寒假算法训练营2
算法
甄心爱学习14 小时前
【python】获取所有长度为 k 的二进制字符串
python·算法
iAkuya14 小时前
(leetcode)力扣100 76数据流的中位数(堆)
算法·leetcode·职场和发展
键盘鼓手苏苏14 小时前
Flutter for OpenHarmony: Flutter 三方库 ntp 精准同步鸿蒙设备系统时间(分布式协同授时利器)
android·分布式·算法·flutter·华为·中间件·harmonyos