我需要找到输入的下一个回文,使得该数字不超过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
}
}
答案 0 :(得分:3)
BigInteger.ONE增加数量?对于拥有1000000位数字的数字来说,这一定是个笑话...... 你觉得要花多长时间?
任务扰流板(请忽略):
如何将数字切换为一半数字,并将这一半连接反转,并在必要时进行一次更改?会不会太难?
如果您知道问题与时间有关,那么您应该通过一些时间测量和记录来围绕代码。您应该记录您拥有的位数以及验证回文所需的时间。你应该先从非常小的数字开始。
答案 1 :(得分:0)
正如V-X指出的那样,没有必要进行整个增量业务,因为我们可以扭转局面:我们可以首先创建回文并测试它们是否比我们的更大,而不是检查哪个数字是回文。目标号码。
想象一下你的数字是123456.最小的回文比它大吗?
总结一下我们做了什么:我们取了数字的前半部分(123456 - > 123),镜像它(123 - > 123321),发现它低于我们的目标,所以我们加了1(123 - > 124)并镜像它(124 - > 124421),这就是我们的答案。如果我们的初始数字是123004,我们会立即接受123321作为我们的回答。
我会留给你来弄清楚当你有一个奇数位数时会发生什么,如果你的数字是9999 ... 9。
顺便说一句,如果你正在测试回文,那就没有必要扭转这个数字了。您可以简单地检查第一个数字是否等于最后一个数字,然后将第二个数字与倒数第二个数字进行比较,依此类推。因为你只扫描一次字符串,它会快得多。
答案 2 :(得分:0)
您应该尽量减少对BigInteger
的使用,因为String
和BigInteger
之间的所有转化都会占用不必要的时间。只需使用next()
代替nextInt()
从扫描仪获取每个号码,并将其保留为String
。获得该号码后,需要考虑五种情况,您可以在一系列if
/ else if
块中进行编程。
n
个9,则下一个回文由一个n-1
个零和另一个零组成。例如,9999
上方的下一个回文是10001
。2n+1
)那么你可以在计算出要检查的位数时向下舍入(到n
)。在这种情况下,下一个回文由数字的前半部分组成,如果有数字则由中间数字组成,然后数字的前半部分反转。例如,如果输入为5678123
,则将567
与321
进行比较。由于567
更大,因此适用此情况,输出应为5678765
。BigInteger
则可以执行此步骤你喜欢)。输出结果是这样,然后是逆转。例如,如果输入为123789
,则数字的前半部分(加上一个)为124
,输出应为124421
。 1234789
,则取1234
。现在添加一个,然后输出结果,然后反转除结果的最后一位之外的所有数字。在此示例中,您输出1235
,然后撤消123
- 即1235321
。与case 4
一样,您可以使用BigInteger
进行添加。