如何去掉尾随零的整数

2024-09-27 21:31:00 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一组整数(例如{1000000, 20000000, 1234000, 1200000}),我想对所有整数应用一个函数:

  1. 一个数的大小被尽可能降低
  2. 所有数字都是整数
  3. 它们的相对比例保持不变

换言之,我希望尽可能多地去掉零,而不丢失绝对量值以外的任何信息,因此集合将变成{1000, 20000, 1234, 1200}

这个操作有没有一个术语,有没有一个有效的Python函数,或者我应该快速编写这个代码?你知道吗

Edit:This solution不是重复的,因为它处理的是单数——在我的例子中,零的数目取决于特定的集合。你知道吗

编辑2:绿斗篷的家伙提供了一个解决方案,为我的确切要求,和伊利莫拉一个做什么,我应该有实际的概念放在第一位。你知道吗


Tags: 函数代码信息编辑数字整数thisedit
3条回答

看看你的需求,你所追求的是什么,可以很容易地做到除以每个输入数字的GCD(最大公分母)的所有输入数字。你知道吗

#!/usr/bin/env python3

import math
from functools import reduce

numbers = [1000000, 20000000, 1234000, 1200000]

# Find the greatest common denominator
gcd = reduce(lambda x,y: math.gcd(x,y), numbers)

# Divide each number by the GCD
minimum_numbers = map(lambda x: int(x/gcd), numbers)

print(*minimum_numbers, sep=',')

使用输入的数字,它将生成以下结果:

500,10000,617,600

由于GCD的属性,输出被保证是可能的最小整数,仍然保持每个数字之间的相对比例。你知道吗

不知道有没有更有效的方法。我会用:

import numpy as np

def reduce(array):

    mult = [0.1]*len(array)

    while all(item%10 == 0 for item in array):
        array = np.multiply(array, mult)

    return array

结果:

intgrs = (1000000, 20000000, 1234000, 1200000)
print(reduce(intgrs))

它将返回具有以下值的numpy数组: [1000 20000 1234 1200]

考虑到你在这里关心的只是数量的减少,你是否考虑过仅仅用Decimal表示数字,然后用科学记数法打印它们?你知道吗

from decimal import Decimal

nums = {Decimal(1000000), Decimal(20000000), Decimal(1234000), Decimal(1200000)}
print({str(num.normalize()) for num in nums})
# {'1E+6', '1.2E+6', '2E+7', '1.234E+6'}

如果这对于您的用例来说不合理,那么您可以做的另一件事就是确定您可以减少的最大幅度,然后再减少那么多。对于震级为10的情况,这相当简单,您可以使用字符串:

nums = {1000000, 20000000, 1234000, 1200000}
div_factor = 10 ** min(len(str(num)) - len(str(num).rstrip('0')) for num in nums)
reduced_nums = {num / div_factor for num in nums}
# {1000.0, 1234.0, 20000.0, 1200.0}
# you can use integer division `//` instead of true division `/` if you want

对于非标准震级(例如震级为3),你需要更具创造性,想出一种方法来有效地计算出你能除以的最大震级。我上面的例子在这里采用了一种快捷方式,即检查当我们去掉尾随的零时有多少数字消失了(这相当于检查10的最大指数,它可以是整数除以数字)。由于python没有内置的方法来打印不是2、8、10或16的基,因此您必须找到自己的解决方案。你知道吗

相关问题 更多 >

    热门问题