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

时间:2015-10-10 19:18:30

标签: python algorithm numeric

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

  

查找具有该数字属性的x1的所有数字n   在x末尾的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或字符串函数来切割数字。

5 个答案:

答案 0 :(得分:2)

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

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

由于itsef的乘法是一个数,所以可能的组合是: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){{1}是将10a + b乘以itsef的结果。

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

答案 1 :(得分:1)

好的这是编辑版本:

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的帖子评论)是最快最简单的。我编辑了代码:

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=', ')

答案 2 :(得分:1)

假设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。

请注意,625显示k = 3和k = 4,但自0625以来的罚款是有效的。在实践中,您只需要检查一次,这样您就可以将自己限制为自身至少为k位的倍数。

答案 3 :(得分:0)

您好我写了这个答案:

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

请让我知道你的想法 - 它有效!

答案 4 :(得分:0)

返回这些数字的列表的函数。

app.post('/tasks/import', async (req, res) => {
  const paramsObj = JSON.parse(Buffer.from(req.body, 'base64').toString('utf-8'));

  const page = paramsObj.page * 1;
  const storeID = paramsObj.storeid;
  const pageSize = 50;
  const config: StoreConfig = await getConfigById(storeID);

  const options = {
    uri: EXTERNAL_URL,
    json: true,
    resolveWithFullResponse: false,
    qs: {
      limit: pageSize,
      page: page,
    },
  };

  try {
    const results = await rp.get(options);
    if (results.products.length === 0) {
      return res.status(200).end();
    }

    const prodLooper = idx => {
      const product = results.products[idx];
      product.store_id = storeID;
      product.body_html = cleanProductBody(product.body_html);
      getUnusedUPC(storeID)
        .then(upcID => {
          product.upc = upcID;

          fsdb
            .collection('products')
            .add(product)
            .then(() => {
              idx++;
              if (idx < results.products.length) {
                prodLooper(idx);
              } else {

                return res.send('OK').end();
              }
            });
        })
        .catch(err => {
          console.log(err.code, ':', page, ':', idx);
          if (err.code === 10) {
            setTimeout(() => {
              prodLooper(idx);
            }, 10);

          }
        });
    };
    prodLooper(0);
  } catch (error) {
    console.log('caught error:');
    console.log(error.statusCode);
    console.log(error.message);
    return res.status(500).end();
  }
});

因此,如果 n 650 ,它将返回

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