我正在使用Python。我有几对数字,我想找到它们的区别,但它们的基数是42。例如,
5.39->5.40->5.41->5.42->6.00
因此,10.38,10.24有0.14,但10.41和11.02有0.03
有没有办法用Python做到这一点?我能想象的唯一方法是为每个案例采用几个IF。
我的数据示例:
[3.08,3.15] --> 0.07
[4.39,5.10] --> 0.13
[13.00,14.12] --> 1.12
[40.42,41.01] --> 0.02
答案 0 :(得分:0)
喜欢这个?使用0.42作为小数部分的上限从B中减去A.
base = 42
a = (5,10)
b = (4,39)
if a > b:
b, a = a, b
overflow = int(b[1] < a[1])
c = (b[0]-a[0]-overflow, b[1]+base*overflow-a[1])
print(c)
问题不是很清楚。我还使用元组来避免解析。
编辑:添加了if guard
答案 1 :(得分:0)
首先,不能有基础42的元素5.42,我认为基数应该是43。
我认为这就是你想要的
a=11.02
b=10.41
base=43
def diff(a,b,base):
x=int(a)*base+int(round((a%1)*100))
y=int(b)*base+int(round((b%1)*100))
print x
print y
return (x-y)/base+((x-y)%base)/100.0
c=diff(a,b,base)
print c
答案 2 :(得分:0)
这可能有点矫枉过正,但是......
digits = '0123456789abcdefghijklmnopqrstuvwxyzABCDEF'
assert len(digits) == 42
def base(n, b=2, digits=digits):
if n < 0:
raise ValueError("no negative numbers")
if n < b:
return digits[n]
res = []
q = n
while q:
q, r = divmod(q, b)
res.append(digits[r])
return ''.join(reversed(res))
def debase(s, base=2, digits=digits):
if not (2 <= base <= len(digits)):
raise ValueError("base must be >= 2 and <= %d" % len(digits))
res = 0
for i, v in enumerate(reversed(s)):
digit = digits.index(v)
res += digit * (base ** i)
return res
class Val(object):
def __init__(self, a, b):
self.a = a
self.b = base(b, 42)
def __sub__(self, other):
a = self.a - other.a
b = debase(self.b, 42) - debase(other.b, 42)
if b < 0:
b += 42
a -= 1
return Val(a, b)
def __repr__(self):
return "Val({a}, {b})".format(a=self.a, b=debase(self.b, 42))
def __str__(self):
return "%d.%02d" % (self.a, debase(self.b, 42))
print Val(4,20) - Val(4,10)
# 0.10
print Val(11,2) - Val(10,41)
# 0.03
答案 3 :(得分:0)
我建议只在int中设置基本参数,但这仅适用于[2,36]中的数字n。相反,您可以使用以下内容转换为任何基地:
def frombase(numbers, n):
return sum(float(a)*n**i for i, a in izip(count(len(numbers)-1, -1), numbers))
def tobase(number, n):
numbers = []
while number:
numbers.append(int(number % n))
number = int(number / n)
return numbers
然后您可以通过执行以下操作来生成每对结果:
converted = map(lambda x: frombase(str(x).split('.'), 42), numbers)
print('.'.join(tobase(abs(converted[1] - converted[0]))))
我会留给您将其概括为任何一组符号 - &gt;任何其他符号集。