Python无法从输入中获得确切的数字

2024-06-16 15:14:07 发布

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

我使用python已经有一段时间了,我对它的使用非常满意,但是我遇到了一个非常奇怪的问题,出于某种原因,当我尝试输入一个大数字并使用int()将其转换为整数时,该数字总是关闭的。 这是一个针对codeforces问题的代码,逻辑是正确的,但由于某种原因,如果我输入n=99999999999999,会发生的情况是n将等于10^18。我假设这是python的一个近似值,我怎样才能避免呢

t=int(input())
for _ in range(t):
    n=int(input())
    if n<10:
        print(n)
    else:
        flag=True
        while flag:
            for i in range(int(math.log10(n))+1):
                digit=n%(10**(i+1))//(10**i)
                if digit==0:
                    continue
                if not (n%digit==0):
                    break
                if i==int(math.log10(n)):
                    print(n)
                    flag=False
            n+=1   

Tags: 代码inforinputifrange数字整数
2条回答

您可以用len(n)-1替换int(math.log10(n))。完全保持在int范围内,Python应该支持“任意大”的数字

import math

t = int(input())
for _ in range(t):
    n=int(input())
    if n<10:
        print(n)
    else:
        flag=True
        while flag:
            for i in range(len(str(n))):  # < here
                digit=n%(10**(i+1))//(10**i)
                if digit==0:
                    continue
                if not (n%digit==0):
                    break
                if i==len(str(n))-1:  # < and here
                    print(n)
                    flag=False
            n+=1

除此之外,我没有检查您的算法:)

事实上,n是正确的,但是math.log10()浮点数有效,而不是整数,因此存在舍入错误,尽管我不确定确切位置。另见:Is floating point math broken?

顺便说一句,你偏离了一个数量级:10^17,而不是10^18

>>> n = 99999999999999999
>>> n
99999999999999999
>>> math.log10(n)
17.0
>>> float(n)
1e+17

要最终解决此问题,请参见Is floating point arbitrary precision available?,例如:

>>> from decimal import Decimal
>>> d = Decimal(10**17-1)
>>> d
Decimal('99999999999999999')
>>> d.log10()
Decimal('16.99999999999999999565705518')
>>> int(d.log10())
16

相关问题 更多 >