找到一个4位数的数字,它的平方是8位数,最后4位数是原始编号

2024-09-28 18:56:26 发布

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

根据对my answer here的评论,提出了一个问题(释义):

编写一个Python程序来找到一个4位数的整数,当乘以它自身时,得到一个8位数的整数,它的最后4位数等于原始数字。

我会贴出我的答案,但我对一个更优雅的解决方案很感兴趣!(对于python来说,新来的人能理解它吗?)在


Tags: 答案answer程序heremy评论数字整数
3条回答

[几乎]一衬:

from math import sqrt, ceil, floor
print(next(x for x in range(ceil(sqrt(10 ** 7)), floor(sqrt(10 ** 8 - 1))) if x == (x * x) % 10000))

打印:

^{pr2}$

时间安排:

%timeit next(x for x in range(ceil(sqrt(10 ** 7)), floor(sqrt(10 ** 8 - 1))) if x == (x * x) % 10000)
546 µs ± 32.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

@theausome的答案(最短的(字符):

%timeit next((x for x in range(3163, 10000) if str(x*x)[-4:] == str(x)), None)
3.09 ms ± 119 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

@jpp的回答(最快):

import numpy as np
from numba import jit

@jit(nopython=True)
def find_result():
    for x in range(1e7**0.5, 1e9**0.5):  
        i = x**2
        if i % 1e4 == x:
            return (x, i)
%timeit find_result()
61.8 µs ± 1.46 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

下面是一个不带任何模块的1-liner解决方案:

>>> next((x for x in range(1000, 10000) if str(x*x)[-4:] == str(x)), None)
9376

如果考虑从10003162的数字,它们的平方表示一个7位数。因此,从3163迭代会更优化,因为平方应该是8位数字。感谢@adrin给出了这么好的观点。在

^{pr2}$

如果您喜欢使用第三方库,可以使用numpy。此版本与numba结合进行优化。在

import numpy as np
from numba import jit

@jit(nopython=True)
def find_result():
    for x in range(1e7**0.5, 1e9**0.5):  
        i = x**2
        if i % 1e4 == x:
            return (x, i)

print(find_result())
# (9376, 87909376)

相关问题 更多 >