-
-
[讨论]滴水逆向作业,定义一个函数,能够输出任意进制的第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编辑
,原因: 想到了另一种方法解决这个问题
赞赏
他的文章
看原图
赞赏
雪币:
留言: