-
-
[讨论]滴水逆向作业,定义一个函数,能够输出任意进制的第N个数(python版)
-
发表于: 2024-8-10 19:19 2151
-
最近在刷滴水逆向三期视频,看到海哥留的一道作业题
定义一个函数,能够输出16进制内的任意进制的第N个数:
结果 = fn(进制,第N个数);
fn(2,100) 返回 1100011
fn(8,100) 返回 143
fn(16,100) 返回 63
根据大模型,修改了一个python版的代码(后面再写一个C语言版),但是总感觉和海哥说的进制数是查出来的有区别,如果有想法的朋友可以讨论。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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语言的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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) |
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2024-8-15 10:51
被startstorm编辑
,原因: 想到了另一种方法解决这个问题
赞赏
他的文章
看原图
赞赏
雪币:
留言: