SPOJ下一个回文(Java)

时间:2018-10-09 13:13:28

标签: java palindrome

import java.util.*;
import java.lang.*;

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        long n,a;
        boolean b;

        try{
            Scanner sc = new Scanner(System.in);
            n = sc.nextLong();

            for ( long i = 0; i<n; i++){
                a = sc.nextLong();
                for ( long j = (a+1); j<1000000000; j++){
                    b = isPalindrome(j);
                    if ( b == true){
                        System.out.println(j);
                        break;
                    }
                }
            }
        } catch ( Exception e){
            return;
        }
    }

    public static boolean isPalindrome(long n){
        String intStr = String.valueOf(n); 
        return intStr.equals(new StringBuilder(intStr).reverse().toString());
    }
}

我的回文代码有什么问题? 在SPOJ中,前两个测试用例正在编译,但对于下一个及以后的测试用例,则显示错误的答案。

第一个测试用例: 2 808 2133

输出: 818 2222

1 个答案:

答案 0 :(得分:0)

原因是intlong的大小都不足以存储给定的不大于1000000位数的正整数K - 1000000位数很好是10 1000000 ,而Long.MAX_VALUE只有2 63 -1。

因此,您必须使用 BigInteger

以下代码似乎可以正常工作(不再使用NZEC),但最终以time limit exceeded结尾。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;

class Main {
    public static void main(String[] args) throws java.lang.Exception {
        int n = Integer.parseInt(readLine());

        for (int i = 0; i < n; i++) {
            BigInteger a = new BigInteger(readLine()).add(BigInteger.ONE);
            if (a.signum() == -1) {
                a = BigInteger.ZERO;
            }
            while (a.toString().length() <= 1000000) {
                if (isPalindrome(a.toString())) {
                    System.out.println(a);
                    break;
                }
                a = a.add(BigInteger.ONE);
            }
        }
    }

    private static boolean isPalindrome(String intStr) {
        int l = intStr.length();
        for (int i=0, j=l-1; i < l/2+1; i++, j--) {
            if (intStr.charAt(i) != intStr.charAt(j)) {
                return false;
            }
        }
        return true;
    }

    private static String readLine() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        return br.readLine();
    }
}