【LeetCode每日一题打卡】479. 最大回文数乘积

260 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。

个人博客链接:bbstudy.net/ (等毕业论文做好后续会完善相关功能)

4.16:最大回文数乘积

LeetCode 479,点击题目可直接跳转至LeetCode

题意

给定一个整数 n ,返回 可表示为两个 n 位整数乘积的 最大回文整数 。因为答案可能非常大,所以返回它对 1337 取余 。

示例1:

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

示例2:

输入: n = 1
输出: 9

提示:1 <= n <= 8

题解:数学+枚举

由于需要计算两位n位整数乘积的最大回文整数。于是可以直接枚举所有的回文数(由于是求最大值,所以直接从大到小枚举)

两位n位整数相乘最多也只能产生102n10^{2n}位的数字。又由于是回文数,我们可以只枚举一半,于是可以从10n110^n-1开始枚举回文数的一半。

然后再遍历它的因子,如果两个因子都是n位整数,则找到答案,即可结束循环。

注意:n=1时,需要特判一下,同时需要注意结果中间结果会爆int,所以需要用long long存储。具体代码如下:

C++代码:

class Solution {
public:
    int largestPalindrome(int n) {
        if(n==1) return 9;
        int ans=0;
        //枚举回文数左边
        for(int i=pow(10,n)-1;i>pow(10,n-1);i--){
            int num=i;long long p=i;   //p表示回文数
            while(num){
                p=p*10+num%10;num/=10;
            }
            
            //遍历它的因子
            for(long long j=pow(10,n)-1;j*j>=p;j--){
                if(p%j==0&&(j>pow(10,n-1))){
                    ans=p%1337;break;
                }
            }
            if(ans!=0) break;
        }
        return ans;
    }
};