力扣 479. 最大回文数乘积

题目

你需要找到由两个 n 位数的乘积组成的最大回文数。
由于结果会很大,你只需返回最大回文数 mod 1337得到的结果。

示例

输入: 2
输出: 987
解释: 99 x 91 = 9009, 9009 % 1337 = 987

说明:
n 的取值范围为 [1,8]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-palindrome-product
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法1:模拟

在这里插入图片描述

从大到小依次构造回文串。

2位数的情况:
最大值为 99x99 = 9801(4位)
4位的回文数有:9889、9779、9669、9559……(从大到小)

如何判断构造的4位回文数是否可以由2位数相乘得到呢?
用回文数 % 除数==0

Python实现
class Solution:
    def largestPalindrome(self, n: int) -> int:
        res=""
        if n==1:
            return(9)

        maxnum=10**n-1 //找最大值
        i=maxnum-1 

        while(i>maxnum/10):
            res=str(i)+str(i)[::-1] //构造回文数,从98开始。因为max*max必不是回文数
            flag=maxnum //构造除数,从99开始
            
            //判断回文数
            while(flag*flag>=int(res)):
                if int(res)%flag==0:
                    return(int(res)%1337)
                else:
                    flag-=1
            i-=1

在这里插入图片描述

Java实现

在这里插入图片描述

class Solution {
    public int largestPalindrome(int n) {
        if (n == 1) return 9;

        int upper = (int)Math.pow(10, n) - 1;
        for (int i = upper; i >= 0; i--) {
            //翻转左半部分到其自身末尾,构造回文数num
            long num = i, var = i;
            while (var != 0) {
                num = num * 10 + (var % 10);
                var /= 10;
            }
            for (long j = upper; j * j >= num; j--) {
                if (num % j == 0) return (int)(num % 1337);
            }
        }
        return -1;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值