1. 程式人生 > >113、最大回文數乘積

113、最大回文數乘積

你需要找到由兩個 n 位數的乘積組成的最大回文數。

由於結果會很大,你只需返回最大回文數 mod 1337得到的結果。

示例:

輸入: 2

輸出: 987

解釋: 99 x 91 = 9009, 9009 % 1337 = 987

說明:

n 的取值範圍為 [1,8]。

程式碼
這道題很明顯如果通過暴力求解會超時,只有進一步的進行迴圈判斷才能達到要求
但是一般使用的是long型別,如果將底下的x換成int型那麼會出錯
一個long型別除以int型會將int型向上轉

class Solution {
   public static int largestPalindrome(int n) {
		
		if (n == 1) {
			return 9;
			
		}else {
			int upper = (int) Math.pow(10, n)-1;
			
			int lower = upper / 10;
			for(int i = upper; i > lower; i--){
				long is = re(i);
				for (**long x = upper;** x * x >= is; x--) {//如果將x型別換成int會出錯
					if(is % x == 0){
						return (int) (is % 1337);
					}
					
				}
				
				
			}
			
			return 0;
			
		}
        
    }
	public static long re(int i){
		
		
		 StringBuffer s=new StringBuffer();
        s.append(Integer.toString(i)).reverse();
        return Long.parseLong(i+s.toString());
		
	}
}
   public static int largestPalindrome(int n) {
		if(n==1)
            return 9;
        int maxNumber=(int)Math.pow(10,n)-1;
        for(int i=maxNumber;i>maxNumber/10;i--){//從大到小遍歷n位數
            long num=palindrome(i);//構造迴文
            for(long j=maxNumber;j*j>=num;j--){//判斷num是否可以分解為兩個n位數相乘
                if(num%j==0)
                    return (int)(num%1337);
            }
        }
        return 0;
    }
    public long palindrome(int i){
        StringBuffer s=new StringBuffer();
        s.append(Integer.toString(i)).reverse();
        return Long.parseLong(i+s.toString());
    }

排名靠前的都是將八個測試用例都寫進去的玩意,真是雞賊啊,哈哈哈~~~