我正在解决 spoj 上的 PALIN,但我收到 NZEC 错误,即使它正在 ideone 上工作
I am solving PALIN on spoj ,but I am getting NZEC error even though it is working on ideone
一个正整数如果从左到右和从右到左读时在十进制中的表示相同,则称为回文。给定一个不超过1000000位的正整数K,写出大于K的最小回文的值输出。显示的数字始终不带前导零。
import java.util.Scanner;
class next{
public static void main(String ags[])
{
Scanner in = new Scanner(System.in);
int n=in.nextInt();
for(int i=0;i<n;i++)
{
String s = in.next();
if(s.length()%2==0)
{
int p = s.length()/2;
String sub = s.substring(0,p);
String sub2= s.substring(p,s.length());
String reverse = new StringBuffer(sub).reverse().toString();
int t = Integer.parseInt(reverse);
int t1= Integer.parseInt(sub2);
if(t>t1)
{
System.out.println(sub+reverse);
}
else
{
int t2 = Integer.parseInt(sub)+1;
String s2 = Integer.toString(t2);
String rev = new StringBuffer(s2).reverse().toString();
System.out.println(s2+rev);
}
}
else
{
int len = s.length()/2;
String se1 = s.substring(0,len);
String se2 = s.substring(len+1,s.length());
String reverse = new StringBuffer(se1).reverse().toString();
int t = Integer.parseInt(reverse);
int t1= Integer.parseInt(se2);
if(t>t1)
{
String se = s.substring(0,len+1);
System.out.println(se+reverse);
}
else
{
String temp = s.substring(0,len+1);
int tn = Integer.parseInt(temp);
tn++;
String left = Integer.toString(tn);
String grip = left.substring(0,left.length()-1);
String reve = new StringBuffer(grip).reverse().toString();
System.out.println(left+reve);
}
}
}
}
}
我是 programming.I 的初学者,我正在尝试在 spoj 上解决这个问题#PALIN,但即使它正在处理 ideone.please 也出现运行时错误,请帮助我
您的代码存在一些问题,但最大的问题是您在可以表示 far 范围之外的值的字符串上调用 Integer.parseInt
=11=]。说明说输入最多可以是一百万位数字,这意味着您要在最多一百万位数字的字符串上调用 Integer.parseInt
— 也就是说,最多 10500000−1 — 但 int
s 只上升到 231−1,小于 1010。
修复该问题后,您可以通过执行以下操作来测试您的代码:
- 将实际计算结果的逻辑提取到它自己的方法中,并带有类似
String computeNextPalindrome(String s)
的签名。这样,您就可以通过以编程方式调用它并检查其结果来测试该方法,而不是乱用标准输出。
- 写一个方法,初始化
expectedResult
为computeNextPalindrome("99999")
的预期结果(即"100001"
),然后从99999
向下迭代到1
,验证 computeNextPalindrome
总是 returns expectedResult
。每次校验后检查当前数是否为回文,如果是则更新expectedResult
为当前数
这样,您就可以详尽地测试您的逻辑是否适用于最多五位数的所有数字。除了我上面提到的错误之外,关于尝试将 int
用于 int
范围之外的值,most 错误将出现在一些小案例中。有一个只影响大值的错误是相当不寻常的;所以通过详尽地测试小值,你可以找到几乎所有的错误。
然后您可以通过抽查一些大值来检查特定于大值的错误,例如 "1234567890123456789012345678901234568790"
(应该给出 "1234567890123456789119876543210987654321"
)。
一个正整数如果从左到右和从右到左读时在十进制中的表示相同,则称为回文。给定一个不超过1000000位的正整数K,写出大于K的最小回文的值输出。显示的数字始终不带前导零。
import java.util.Scanner;
class next{
public static void main(String ags[])
{
Scanner in = new Scanner(System.in);
int n=in.nextInt();
for(int i=0;i<n;i++)
{
String s = in.next();
if(s.length()%2==0)
{
int p = s.length()/2;
String sub = s.substring(0,p);
String sub2= s.substring(p,s.length());
String reverse = new StringBuffer(sub).reverse().toString();
int t = Integer.parseInt(reverse);
int t1= Integer.parseInt(sub2);
if(t>t1)
{
System.out.println(sub+reverse);
}
else
{
int t2 = Integer.parseInt(sub)+1;
String s2 = Integer.toString(t2);
String rev = new StringBuffer(s2).reverse().toString();
System.out.println(s2+rev);
}
}
else
{
int len = s.length()/2;
String se1 = s.substring(0,len);
String se2 = s.substring(len+1,s.length());
String reverse = new StringBuffer(se1).reverse().toString();
int t = Integer.parseInt(reverse);
int t1= Integer.parseInt(se2);
if(t>t1)
{
String se = s.substring(0,len+1);
System.out.println(se+reverse);
}
else
{
String temp = s.substring(0,len+1);
int tn = Integer.parseInt(temp);
tn++;
String left = Integer.toString(tn);
String grip = left.substring(0,left.length()-1);
String reve = new StringBuffer(grip).reverse().toString();
System.out.println(left+reve);
}
}
}
}
}
我是 programming.I 的初学者,我正在尝试在 spoj 上解决这个问题#PALIN,但即使它正在处理 ideone.please 也出现运行时错误,请帮助我
您的代码存在一些问题,但最大的问题是您在可以表示 far 范围之外的值的字符串上调用 Integer.parseInt
=11=]。说明说输入最多可以是一百万位数字,这意味着您要在最多一百万位数字的字符串上调用 Integer.parseInt
— 也就是说,最多 10500000−1 — 但 int
s 只上升到 231−1,小于 1010。
修复该问题后,您可以通过执行以下操作来测试您的代码:
- 将实际计算结果的逻辑提取到它自己的方法中,并带有类似
String computeNextPalindrome(String s)
的签名。这样,您就可以通过以编程方式调用它并检查其结果来测试该方法,而不是乱用标准输出。 - 写一个方法,初始化
expectedResult
为computeNextPalindrome("99999")
的预期结果(即"100001"
),然后从99999
向下迭代到1
,验证computeNextPalindrome
总是 returnsexpectedResult
。每次校验后检查当前数是否为回文,如果是则更新expectedResult
为当前数
这样,您就可以详尽地测试您的逻辑是否适用于最多五位数的所有数字。除了我上面提到的错误之外,关于尝试将 int
用于 int
范围之外的值,most 错误将出现在一些小案例中。有一个只影响大值的错误是相当不寻常的;所以通过详尽地测试小值,你可以找到几乎所有的错误。
然后您可以通过抽查一些大值来检查特定于大值的错误,例如 "1234567890123456789012345678901234568790"
(应该给出 "1234567890123456789119876543210987654321"
)。