一起养成写作习惯!这是我参与「掘金日新计划 · 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位整数相乘最多也只能产生位的数字。又由于是回文数,我们可以只枚举一半,于是可以从开始枚举回文数的一半。
然后再遍历它的因子,如果两个因子都是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;
}
};