码迷,mamicode.com
首页 > 编程语言 > 详细

LeetCode 479 - Largest Palindrome Product - Hard ( Python)

时间:2020-02-01 10:47:36      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:整数   pattern   class   组成   pytho   lan   大于   number   upper   

Find the largest palindrome made from the product of two n-digit numbers.

Since the result could be very large, you should return the largest palindrome mod 1337.

 

Example:

Input: 2

Output: 987

Explanation: 99 x 91 = 9009, 9009 % 1337 = 987

 

Note:

The range of n is [1,8].

题意:给一个digit的位数,找出由两个这个位数组成的digit相乘的最大palindrome的数字。

思路:假设我们得到的res = m * l。由m和n这两个数字组成。同时我们可以发现所有的答案还满足一个pattern: 10 ** n * upper + lower. 

以及如果在得到答案的时候,m和n两个数字基本都会尽可能接近10**n。那么我们假设m=10**n-i, l = 10 ** n - j. (注意不是加,不然的话,m和l就是超过n位数的了)。把m和l的表达式代到res中,我们可以得到res = 10**N (10**N-i-j)+ i*j = 10**N*upper + lower。 令i+j = a, 那么i*j = a*i - i*i。 

我们对a 进行range(2, 9*10**(n-1))的遍历。(因为i 大于等于1,j大于等于1,所以a至少为2)。在a的遍历过程中,计算upper的值为10**N-a, lower=int(str(upper)[::-1)。 暂时不是很明白为什么等于这个。因为low = a*i-i**i. 所以(i-a/2)^2 = (a^2-4*low)/4. 等号前是一个整数,那么我们只需要找到第一个a^2-4*low为整数的值,即为所求的a的值,从而得到最终的答案。(因为upper是10^N-a,所以a越小,最终的答案越大。

class Solution:
    def largestPalindrome(self, n: int) -> int:
        if n == 1:
            return 9 
        for a in range(2, 9*10**(n-1)):
            upper = (10 ** n) -a 
            low = int(str(upper)[::-1])
            if (a ** 2 - 4 * low) < 0:
                continue 
            if (a**2 - 4*low)** 0.5 ==   int((a**2 - 4*low)**0.5):
            if (a**2-4*lo)**.5 == int((a**2-4*lo)**.5):
                return (low+10**n*(10**n-a))%1337

 

LeetCode 479 - Largest Palindrome Product - Hard ( Python)

标签:整数   pattern   class   组成   pytho   lan   大于   number   upper   

原文地址:https://www.cnblogs.com/sky37/p/12247649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!