在java中使用带BigInteger的reverse()

时间:2014-07-16 17:38:17

标签: java biginteger

我需要找到输入的下一个回文,使得该数字不超过1000000 DIGITS。 为此,我正在使用BigInteger并且我得到了#34;超出了时间限制"。

现在该怎么办?

import java.util.*;
import java.lang.*;
import java.io.*;
import java.math.BigInteger;


class Ideone
{
    static boolean palindrome(BigInteger a)
    {
        String b=""+a;
        StringBuffer s=new StringBuffer(b);
        StringBuffer c=s.reverse();
        String d=c.toString();

        return d.equals(b);
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        while(t-->0){
            BigInteger k=sc.nextBigInteger();
            try{for(BigInteger i=k.add(BigInteger.ONE);;i=i.add(BigInteger.ONE)){
                if(palindrome(i)){System.out.println(""+i); break;}

            }//for
            }catch(Exception e){}


        }//wh
    }
}

3 个答案:

答案 0 :(得分:3)

BigInteger.ONE增加数量?对于拥有1000000位数字的数字来说,这一定是个笑话...... 你觉得要花多长时间?

任务扰流板(请忽略):

  

如何将数字切换为一半数字,并将这一半连接反转,并在必要时进行一次更改?会不会太难?

如果您知道问题与时间有关,那么您应该通过一些时间测量和记录来围绕代码。您应该记录您拥有的位数以及验证回文所需的时间。你应该先从非常小的数字开始。

答案 1 :(得分:0)

正如V-X指出的那样,没有必要进行整个增量业务,因为我们可以扭转局面:我们可以首先创建回文并测试它们是否比我们的更大,而不是检查哪个数字是回文。目标号码。

想象一下你的数字是123456.最小的回文比它大吗?

  • 是否有123xyz 形式的解决方案(x,y和z表示缺少的数字)?这种形式只有一个回文数:123321.但是因为123321< 123456,这不是我们的答案。
  • 那么124xyz怎么样?按照相同的逻辑,我们发现只有一个这样的数字,124421,大于123456。
  • 中间还有其他的回文吗?由于123999和124000之间没有数字,我们已经证明不存在。
  • 因此我们的答案是124421。

总结一下我们做了什么:我们取了数字的前半部分(123456 - > 123),镜像它(123 - > 123321),发现它低于我们的目标,所以我们加了1(123 - > 124)并镜像它(124 - > 124421),这就是我们的答案。如果我们的初始数字是123004,我们会立即接受123321作为我们的回答。

我会留给你来弄清楚当你有一个奇数位数时会发生什么,如果你的数字是9999 ... 9。

顺便说一句,如果你正在测试回文,那就没有必要扭转这个数字了。您可以简单地检查第一个数字是否等于最后一个数字,然后将第二个数字与倒数第二个数字进行比较,依此类推。因为你只扫描一次字符串,它会快得多。

答案 2 :(得分:0)

您应该尽量减少对BigInteger的使用,因为StringBigInteger之间的所有转化都会占用不必要的时间。只需使用next()代替nextInt()从扫描仪获取每个号码,并将其保留为String。获得该号码后,需要考虑五种情况,您可以在一系列if / else if块中进行编程。

  • 案例1 - 输入无效 - 它并不完全由数字组成。目前尚不清楚如何处理此问题,或者您是否想要打扰
  • 案例2 - 输入完全由9个组成。如果有n个9,则下一个回文由一个n-1个零和另一个零组成。例如,9999上方的下一个回文是10001
  • 案例3 - 数字的后半部分(反向)小于数字的前半部分。您可以使用字符串比较 - 不需要转换任何内容任何数字类型。如果有一个奇数位数(比如2n+1)那么你可以在计算出要检查的位数时向下舍入(到n)。在这种情况下,下一个回文由数字的前半部分组成,如果有数字则由中间数字组成,然后数字的前半部分反转。例如,如果输入为5678123,则将567321进行比较。由于567更大,因此适用此情况,输出应为5678765
  • 案例4 - 其他案例均不适用,甚至数字。取数字的前半部分并添加一个(如果是BigInteger则可以执行此步骤你喜欢)。输出结果是这样,然后是逆转。例如,如果输入为123789,则数字的前半部分(加上一个)为124,输出应为124421
  • 案例5 - 其他案例均不适用,数字为奇数。取数字的前半部分;在确定要包括多少位数时向上舍入。例如,如果输入为1234789,则取1234。现在添加一个,然后输出结果,然后反转除结果的最后一位之外的所有数字。在此示例中,您输出1235,然后撤消123 - 即1235321。与case 4一样,您可以使用BigInteger进行添加。