首页
社区
课程
招聘
[讨论]滴水逆向作业,定义一个函数,能够输出任意进制的第N个数(python版)
发表于: 2024-8-10 19:19 2042

[讨论]滴水逆向作业,定义一个函数,能够输出任意进制的第N个数(python版)

2024-8-10 19:19
2042

最近在刷滴水逆向三期视频,看到海哥留的一道作业题


定义一个函数,能够输出16进制内的任意进制的第N个数:

结果 = fn(进制,第N个数);

fn(2,100) 返回  1100011

fn(8,100) 返回  143

fn(16,100) 返回  63




根据大模型,修改了一个python版的代码(后面再写一个C语言版),但是总感觉和海哥说的进制数是查出来的有区别,如果有想法的朋友可以讨论。

base = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']


def print_jin_zhi(jin_zhi: int, num: int):
    if jin_zhi < 2 or jin_zhi > 16:
        print("进制必须在2进制到16进制之间")
    if num <= 0:
        print("个数必须大于等于1")
    qu_shu = base[:jin_zhi]
    print("取数", qu_shu)
    number_in_base = ""
    if num == 0:
        number_in_base = qu_shu[0]
    else:
        number_in_base = ""
        while num > 0:
            number_in_base = qu_shu[num % jin_zhi] + number_in_base
            num = num // jin_zhi
    print(number_in_base)


if __name__ == '__main__':
    print_jin_zhi(16, 32)



后面我想写一个函数,能后输出16进制内的任意进制的前N个数:

比如,2进制的前3个数为:0 , 1 , 10

base = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']


def print_jin_zhi(jin_zhi: int, num: int):
    if jin_zhi < 2 or jin_zhi > 16:
        print("进制必须在2进制到16进制之间")
    if num <= 0:
        print("个数必须大于等于1")
    qu_shu = base[:jin_zhi]
    print("取数", qu_shu)
    number_in_base = ""
    for i in range(num):
        if i == 0:
            number_in_base = qu_shu[0]
        else:
            number_in_base = ""
            while i > 0:
                number_in_base = qu_shu[i % jin_zhi] + number_in_base
                i = i // jin_zhi
        print(number_in_base)


if __name__ == '__main__':
    print_jin_zhi(16, 17)



===================================================

经过思考,突然冒出一个想法,就是模拟人去数数,这样就跟海哥说的进制数是查出来的比较接近了。

思路就是,用python中的列表,模拟8个位置,根据进制的不同,然后进位,最后输出。

代码在下面,写的不好,如果有好的想法大家可以一起讨论。后续再写一版C语言的。

base = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']

# 假设,这个数的位数,不超过8位
result = ['0', '0', '0', '0', '0', '0', '0', '0']


def print_jin_zhi(jin_zhi: int, num: int):
    if jin_zhi < 2 or jin_zhi > 16:
        print("进制必须在2进制到16进制之间")
    if num <= 0:
        print("个数必须大于等于1")
    qu_shu = base[:jin_zhi]
    print("取数", qu_shu)

    a: int = 1
    jin_wei: int = 0  # 进位变量。如果超过,修改进位变量为0
    while (a <= num):
        # 判断当前的数是不是进制的最后一个数,如果不是,直接加1,如果是,变为0,需要进一位
        if a < 2:
            a = a + 1
            continue
        # 判断,当前位置上的数,是否需要进位,如果$符号,停止
        for i in range(8):
            # 根据qu_shu列表,加上进位,获取当前的下标
            if jin_wei == 0:
                index_now = qu_shu.index(result[i])
            else:
                index_now = qu_shu.index(result[i]) + 1
            # 加上之前的进位,数的时候,仍然不是最后一位,
            # 那么加1后不需要进位,当前位置加1再加进位即可,后面的不变,跳出循环
            if i == 0:
                if index_now <= jin_zhi - 2:
                    result[i] = qu_shu[index_now + 1]
                    jin_wei = 0
                    break
                else:
                    result[i] = '0'
                    jin_wei = 1
                    pass
            else:
                if index_now <= jin_zhi - 1:
                    result[i] = qu_shu[index_now]
                    jin_wei = 0
                    break
                else:
                    result[i] = '0'
                    jin_wei = 1
                    pass

        pass
        a = a + 1


if __name__ == '__main__':
    print_jin_zhi(16, 4097)
    # 算出的结果的列表
    print(result)
    # 调整顺序输出
    ret = ""
    for i in range(8):
        ret = result[i] + ret
    print(ret)







[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2024-8-15 10:51 被startstorm编辑 ,原因: 想到了另一种方法解决这个问题
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//