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

运行结果:

相关推荐
马剑威(威哥爱编程)2 小时前
Libvio.link爬虫技术解析:搞定反爬机制
爬虫·python
adam_life2 小时前
区间动态# P1880 [NOI1995] 石子合并】
算法
坠金2 小时前
递归、递归和回溯的区别
算法
zhougl9962 小时前
Java 枚举类(enum)详解
java·开发语言·python
春栀怡铃声2 小时前
认识二叉树~
c语言·数据结构·经验分享·c·编译
恋爱绝缘体12 小时前
Java语言提供了八种基本类型。六种数字类型【函数基数噶】
java·python·算法
serve the people2 小时前
python环境搭建 (三) FastAPI 与 Flask 对比
python·flask·fastapi
仰泳的熊猫2 小时前
题目1434:蓝桥杯历届试题-回文数字
数据结构·c++·算法·蓝桥杯
星火开发设计2 小时前
格式化输入输出:控制输出精度与对齐方式
开发语言·c++·学习·算法·函数·知识