`n` 何时匹配 `n^2` 的最后一位?

When does `n` match last digits of `n^2`?

我正在解决一个编程问题。

Find all numbers x from 1 to n that have a property that digits of x match digits at the end of x^2.

例如:

5 matches last digit of 5^2 (25)
6 matches last digit of 6^2 (36)
25 matches last digits of 25^2 (625)
76 matches last digits of 76^2 (5776)
376 matches last digits of 376^2 (141376)
625 matches last digits of 625^2 (390625)
etc.

有谁知道一个数字在其平方的最后一位中匹配自身的数值标准是什么?

我在 Python 中编程,我只能使用数字运算,例如 /%//*+,等等

我不能使用 strlen 或字符串函数来分割数字。

不是一个完整的标准,但可以作为起点:

首先:回想一下乘法中的最后一位是第一个操作数的最后一位乘以第二个操作数的最后一位的乘积的最后一位。

由于是一个数乘以自身,可能的组合有:0x0、1x1、2x2、3x3、4x4、5x5、6x6、7x7、8x8、9x9。

最后一位与操作数相同的乘法是0x0、1x1、5x5和6x6

所以您可以先只测试以 0、1、5 或 6 结尾的数字。

对于这些数字中的每一个,您都可以通过在它们前面加上数字 1、2、3、...、9 来构建一个两位数。因此,对于数字 0,您有 10,20,30,...,90 。现在你必须找出这些数字中的哪一个乘以 itsef 产生的结果与它的倒数第二个数字相同。设这两位数为 10a+b,其中 a 是十位,b 是个位。 b 的值已经固定并且是 0、1、5 或 6 之一。为 b 设置一个值并让 (10a+b)(10a+b) 即 100a^2 + 20ab + b^2 是 10a+b 乘以 itsef 的结果。

我们对这个数的十位感兴趣,所以我们将它分成10,得到10a^2 + 2ab + b^2/10并做一个10模来分离出十位。在表达式中替换 b 的值,对最后一项执行整数除法。例如,对于 b=5,表达式将是 (10a^2 + 20*5*a + 2) mod 10。使此表达式等于 a,您将得到一个等式,可以得出 a 的哪些值与等式相匹配。

嗨,我写了这个答案:

n=int(input('n='))

for m in range(1, n+1):
    d=m**2
    x = m

    all = 0
    all2 = 0

    while x != 0:
        if x%10 == d%10:
            all += 1
        x = x//10
        d = d//10
        all2 += 1

    if all == all2:
        print m

请告诉我您的想法 - 它有效!

好的,这是编辑后的版本:

LastNum=int(input("Enter end limit: "))
def y(num):
    count=0
    while num!=0:
        num=num//10
        count=count+1
    return count
def LastDigitMatch(x):
    if x%(10**y(x))==(x**2)%(10**y(x)):
        return True
    else:
        return False
print('The required list of numbers: ')
for num in range(1,LastNum+1):
    if LastDigitMatch(num):
        print(num,end=', ')

我发现 Giorgi Nakeuri 的版本(参见 Dave Galvin 的 post 的评论)是所有版本中最快和最简单的。我编辑了代码:

import math
LastNum=int(input("Enter the end limit: "))
print('The required list of numbers:')    
for x in range(1,LastNum+1):
    if x%(10**math.floor(math.log10(x)+1))==(x**2)%(10**math.floor(math.log10(x)+1)):
        print(x,end=', ')

假设 x 有 k 个数字。然后 x^2 以 x 的数字结尾当且仅当 x^2 - x 以 k 个零结尾,即如果 x(x-1) 以 k 个零结尾。

计算 2 进入 x 和 x-1 的次数(总和),然后对 5 做同样的事情。如果它们的最小值至少与位数一样大,则您有优胜者。如果没有,你就没有。

例如,考虑 5。5 进入 5 一次并进入 4 个零次,2 进入 5 个零次并进入 4 两次。 1 和 2 的最小值是 1。 5 是一位数,所以你中奖了。


找到 1 和 n 之间所有此类数字的简单方法是只检查 5 的幂的倍数。因为对于每个 k 位数字,您需要 5^k 作为一个因数,检查 5^k 和所有不超过k位的倍数。这可能是 x 或 x-1,因此您还需要检查上面的数字。

所以要检查的数字是:

k=1: 5, 6
k=2: 25, 26, 50, 51, 75, 76
k=3: 125, 126, 250, 251, 375, 376, 500, 501, 625, 626, 750, 751, ...
k=4: 625, 626, 1250, 1251, ...

等...

您需要检查的所有这些是最小设置位是否让您至少得到 k 2s。

请注意,k=3 和 k=4 时都显示 625,但这没关系,因为 0625 是有效的。实际上你只需要检查一次,所以你可以限制自己的倍数本身至少是 k 位数。

一个函数,其中 return 是这些数字的 列表

def mathcing_squared(n):
    return [x for x in range(1, n + 1) if str(x ** 2).endswith(str(x))]

所以如果n650,它会return

[1, 5, 6, 25, 76, 376, 625]