鱼C论坛

 找回密码
 立即注册
查看: 1953|回复: 23

进制2

[复制链接]
发表于 2019-7-5 17:54:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问 , 由 13609683913728 得到二进制数  

1100 0 110000 0 11000000  0 110000 0000 0  1100 0000 0000   

并且,先按照其中的一个0分开之后, 然后对每一个二进制数进行缩减? 我也不太清楚, 就是1100 -- 》 10

结果是这个样子的 [10, 100, 1000, 100000 ] --> [2,4,8,16,32]

我用的是检测每两位的值是否相等...

还有别的办法吗? 请码一下。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-7-5 18:42:33 | 显示全部楼层
我能问问你是怎么做的吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-5 19:26:03 | 显示全部楼层
是这个意思吗

>>> import re
>>> lst=[int(x[1:-1],2) for x in re.sub(r"(0)1"," 1",bin(13609683913728)[2:]).split(" ")]
>>> lst
[2, 8, 32, 128, 512]
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-5 22:02:08 | 显示全部楼层
本帖最后由 都淡忘 于 2019-7-5 22:03 编辑

最好理解的就是用2除数字取余。十进制数字5为例子,2除5余1,商取整得2;再用2除2余0,商取整得1:再用2除1余1,商取整得0,运算完毕。
把余数全部取过来。
得到101
代码如下:
  1. # 十进制转二进制函数手写
  2. def bbin(x):
  3.     str1 = ""  # 定义一个空字符串
  4.     y = abs(x)
  5.     while y:  # 地板除,直到商为0时候停止运算
  6.         str1 = "".join([str(y % 2), str1])
  7.         y = y // 2
  8.     str1 = "".join(["0b", str1])  # 将0b字符串加到前面
  9.     str1 = str1 if x > 0 else "".join(["-", str1])  # 区分正负数
  10.     if x == 0:
  11.         str1 = "0b0"  # 初始条件不允许0,故这里补上
  12.     return str1


  13. z = int(input("请输入数字:"))  # int(float(input("请输入数字:"))) int()只能转化纯数字的字符
  14. print(bbin(z))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-5 23:11:36 | 显示全部楼层
新手·ing 发表于 2019-7-5 18:42
我能问问你是怎么做的吗

就是,每次检测两位数,若是相等则放到一个新的列表,若是碰到01的时候,也就是那两个数不相等的时候, 则把那个0给去掉,然后再去掉重复的就好了。。过程挺麻烦的,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-5 23:16:02 | 显示全部楼层
wp231957 发表于 2019-7-5 19:26
是这个意思吗

>>> import re

不是的。。就是,数字先转化成二进制,然后再检测,是否每对数都刚好是一样的,若出现01这种情况的话,则要把前面那个0给去掉,例如 1100 ,然后 去掉重复的 就变成 10, 就是2**1 , 然后 110000的话就是 100, 2**3, 也就是8 。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-5 23:17:19 | 显示全部楼层
都淡忘 发表于 2019-7-5 22:02
最好理解的就是用2除数字取余。十进制数字5为例子,2除5余1,商取整得2;再用2除2余0,商取整得1:再用2除1 ...

可能是我表达的不够明白- - ... 我想做的是 由 1100 0 110000 0 11000000  0 110000 0000 0  1100 0000 0000  这一串二进制, 转变成  [2,4,8,16,32]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-6 03:06:30 From FishC Mobile | 显示全部楼层
lou 发表于 2019-7-5 23:17
可能是我表达的不够明白- - ... 我想做的是 由 1100 0 110000 0 11000000  0 110000 0000 0  1100 0000 0 ...

这不就是2的①次方2的②次方,,,,,,
还用分析吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-6 09:35:39 | 显示全部楼层
lou 发表于 2019-7-5 23:17
可能是我表达的不够明白- - ... 我想做的是 由 1100 0 110000 0 11000000  0 110000 0000 0  1100 0000 0 ...

我没看懂要求是什么啊,输入什么,返回什么啊,,有点迷糊,,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-6 12:48:18 | 显示全部楼层
wp231957 发表于 2019-7-6 03:06
这不就是2的①次方2的②次方,,,,,,
还用分析吗

唔... 不太对, 就是你看,在这个例子里面,我最后由1100这个二进制变成 10之后, 那么十进制数就是 2  
这只是一个例子, 然后呢,如果我有11110000这种例子的话,那二进制就是1100, 十进制就是 12.  所以,
结果是取决于前面的二进制最终缩减之后是什么样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-6 12:59:35 | 显示全部楼层
都淡忘 发表于 2019-7-6 09:35
我没看懂要求是什么啊,输入什么,返回什么啊,,有点迷糊,,

1. 输入 13609683913728 , 然后转成二进制 11000110000011000000011000000000110000000000
2. 分析这个二进制,把两两重复的减去一位,例如1100 —》 10 , 这时可以检测到,有时候会检测到01这种情况, 那么就代表前面的0是多余的,这时候就要把0去掉。
3. 去掉多余的0之后, 并且去掉重复的值之后,那么就可以得到。[10 100 1000 10000 100000]
4.然后就是转化成十进制数[2,4,8,16,32]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-6 13:39:20 From FishC Mobile | 显示全部楼层
lou 发表于 2019-7-6 12:59
1. 输入 13609683913728 , 然后转成二进制 11000110000011000000011000000000110000000000
2. 分析这 ...

我有点明白了,成对去看,分割条件是遇见01这种,那遇见两种情况呢?
一是长度是奇数咋看,例如转化成二进制110,这咋看?
二是长度是偶数,遇见的是10?例1110?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-6 14:37:32 | 显示全部楼层
都淡忘 发表于 2019-7-6 13:39
我有点明白了,成对去看,分割条件是遇见01这种,那遇见两种情况呢?
一是长度是奇数咋看,例如转化成二 ...

因为是根据0来划分,那么一旦遇到01的话,就把0去掉,因为后面肯定是11,那个0的话只是用来区别两个不同整数的二进制。 然后 如果碰到10 ,那么直接报错,因为再pop掉前面所有的检测之后,那么剩下的不可能有10。

你的意思是 第二步的二进制长度是奇数的情况吗? 那就要看你输入的数字是什么样的了。110的话可以设置一个条件,因为这样的话 最后只剩下一个0, 这样是不符合要求的,直接报错就好

偶数的话,碰到10就报错,因为这里不需要用到1来划分,因此也就不存在10的情况 , 并且10也不想等,所以也不能够进行缩减 不像11可以变成1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-6 16:17:51 | 显示全部楼层
lou 发表于 2019-7-6 14:37
因为是根据0来划分,那么一旦遇到01的话,就把0去掉,因为后面肯定是11,那个0的话只是用来区别两个不同 ...

我晕了!!!
成对来看?我从头来一下,首先成对四种情况:11,00,10,01
11 -> 1
00 -> 0
01 -> 分割并且保留1继续
10 -> ????这里要做什么
要不你直接把需求我看下,我想下,我真没搞懂!原谅我理解能力
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-6 17:21:33 | 显示全部楼层
都淡忘 发表于 2019-7-6 16:17
我晕了!!!
成对来看?我从头来一下,首先成对四种情况:11,00,10,01
11 -> 1

h h h h..原谅我没表达清楚, 你说得大致都对啦,就是最后那个10的情况。检测到的话直接报错就好了。然后这样就完成了。 没啥需求...就是我在做一个题目
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-6 17:52:38 | 显示全部楼层
lou 发表于 2019-7-6 17:21
h h h h..原谅我没表达清楚, 你说得大致都对啦,就是最后那个10的情况。检测到的话直接报错就好了。然后 ...

我靠,权限不够,好友都加不了,,,等等,那我看看这代码该怎么写,难道是在做leetcode的题?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-6 17:52:46 | 显示全部楼层
lou 发表于 2019-7-6 17:21
h h h h..原谅我没表达清楚, 你说得大致都对啦,就是最后那个10的情况。检测到的话直接报错就好了。然后 ...

>>> import re
>>> t=13609683913728
>>> lst=re.split(" ",re.sub("01","0 1",bin(t)[2:]))
>>> lst2=[int("1"*(x.count("1")//2)+"0"*(x.count("0")//2),2) for x in lst]
>>> lst2
[2, 4, 8, 16, 32]
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-6 19:16:43 | 显示全部楼层
wp231957 发表于 2019-7-6 17:52
>>> import re
>>> t=13609683913728
>>> lst=re.split(" ",re.sub("01","0 1",bin(t)[2:]))

唔.... 这个,感觉怪怪的,这个数字确实能得出,但是 换另外一个之后,例如857310204, 本应该输出[10, 20, 30]
但是你这个,[2, 2, 2, 4, 30], 可能问题出在你是不是按照固定的位置来分呀? 就是隔相同位置的0.。我太清楚问题出在哪里
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-6 19:33:55 | 显示全部楼层
lou 发表于 2019-7-6 19:16
唔.... 这个,感觉怪怪的,这个数字确实能得出,但是 换另外一个之后,例如857310204, 本应该输出[10, 2 ...

>>> s=bin(857310204)
>>> s
'0b110011000110011000001111111100'
不知道你这个10,20 都是咋来的  你比划比划
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-6 20:22:24 | 显示全部楼层
  1. def fun2(s=str(11000110000011000000011000000000110000000000)):  # 111,110这种类型又怎么去分类?0或1呢。

  2.     result_list = []
  3.     while len(s) > 1:  # 不成对的舍弃了
  4.         temp = s[0] if s[0] == s[1] else -1
  5.         if temp == -1:
  6.             if s[0] == "0":
  7.                 temp = "-"  # 自定义的分隔符
  8.                 result_list.append(temp)
  9.                 s = s[1:]  # 舍弃掉"0"
  10.             elif s[0] == "1":  # "10"直接godie
  11.                 return "报错"
  12.         else:
  13.             result_list.append(temp)
  14.             s = s[2:]  # 完美消消乐
  15.     temp = "".join(result_list).split("-")  # 先连接起来,以分隔符划分
  16.     num_list = []
  17.     for i in temp:
  18.         num_list.append(int(i, 2))  # 二进制转十进制
  19.     return num_list


  20. print(fun2(str(1111011)))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-16 18:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表