LeetCode蹂躏集

2018-06-20 479. Largest Palindro

2018-06-20  本文已影响0人  alexsssu

题意:给你一个数n,1 <= n <= 8,代表n位数,返回由2个n位数乘积组成的最大回文数,并mod 1337。
解题思路:
1、得到可能的回文数。
2、判断这个回文数是否能由两个n位数相乘得到。
第1步:得到回文数。
给一个n,首先n位最大数是high=pow(10,n)-1.
例如n = 5,则pow(10,5)-1 = 100000-1= 99999.
n位最小数是low=pow(10,n-1).
例如n = 5, 则pow(10,4) = 10000。
由2个5位数相乘,乘积一定是9位数、或10位数。
但当n>1时,两个n位数相乘最大回文结果必然是2n位数的。(不知道为什么。。。)
所以先构造回位数,从大到小,999999999,9999889999,......用一个for循环从high开始前5位等于high后5位为reverse high。
第2步:判断是否能由两个n位数相乘得到。
得到cand为回文数,则从j = high开始必须满足j * j >= cand,否则一定不满足条件。此时如果cand % j == 0,则cand为解。

class Solution {
public:
    int largestPalindrome(int n) {
        if(n == 1) return 9;
        int high = pow(10, n)-1;
        int low = pow(10, n-1);
        for(int i = high; i >= low; --i){
            long cand = getPalindrome(i);
            for(long j = high; j * j >= cand; --j)
                if(cand % j == 0)
                    return cand % 1337;
        }
        return -1;
    }
    long getPalindrome(int n){
        string ss = to_string(n);
        reverse(ss.begin(), ss.end());
        return stol(to_string(n) + ss);
    }
};
上一篇下一篇

猜你喜欢

热点阅读