我尝试制作一个可以找到回文编号的程序(它必须是两个3位数字的产品,我希望它包含6位数,但这并不重要)。这是我的代码:
public class palindromicNumber {
public static void getPalindromicNumber() {
boolean podminka = false;
int test;
String s;
for (int a = 999; podminka == false && a > 100; a--) {
for (int b = 999; podminka == false && b > 100; b--) {
test = a * b;
s = Integer.toString(test);
int c = 0;
int d = s.length();
while (c != d && podminka == false) {
if (s.charAt(c) == s.charAt(d)) { // I think that problem is here but I can't see what
System.out.println(s);
podminka = true;
}
c++;
d--;
}
}
}
}
}
如果我想编译它:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
at java.lang.String.charAt(String.java:695)
at faktorizace.palindromicNumber.getPalindromicNumber(palindromicNumber.java:24)
at faktorizace.Faktorizace.main(Faktorizace.java:19)
Java结果:1
答案 0 :(得分:2)
这里有两个问题:
如果c
从奇数开始,d
开始关闭,则c
永远不会等于d
。你需要使用
while (c < d && !podminka) // Prefer !x to x == false
此外,明智地使用break
和return
可以避免您必须拥有podminka
。
除了另一个之外,你有一个关注点分离的问题。您的方法目前有三件事:
你应该将它们分开。例如:
public void printFirstPalindrome() {
long palindrome = findFirstPalindrome();
System.out.println(palindrome);
}
public long findFirstPalindrome() {
// Looping here, calling isPalindrome
}
public boolean isPalindrome(long value) {
// Just checking here
}
我怀疑findFirstPalindrome
通常也会采用一些参数。在这一点上,您将拥有在编写和测试时更容易的方法。
答案 1 :(得分:1)
字符串索引来自[0..length - 1]
将int d = s.length();
更改为int d = s.length() - 1;
更新:暂时不在,
时将podminka
设置为true
s.charAt(c) == s.charAt(d)
例如,如果s = 100101
,则会在while循环的第一次迭代中终止所有循环,因为第一个和最后一个字符是相同的。
答案 2 :(得分:0)
int d = s.length();
字符串字符数组只会从0 - length-1开始。
s.charAt(d)
在第一次迭代时总是不受限制。
答案 3 :(得分:0)
查看JDK源代码:
public char charAt(int index) {
if ((index < 0) || (index >= count)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index + offset];
}
您可以看到,当index小于零或超过字符串长度时,抛出此异常。现在使用调试器,调试代码,看看为什么将这个错误的参数值传递给charAt()
。
答案 4 :(得分:0)
public class palindromicNumber {
public static void getPalindromicNumber(){
boolean podminka = false;
int test;
String s;
for(int a = 999;podminka == false && a>100; a-- ){
for(int b = 999;podminka == false && b>100; b-- ){
test = a*b;
s = Integer.toString(test);
int c = 0;
int d = s.length();
while(c!=d && podminka == false){
if(s.charAt(c)==s.charAt(d - 1)){
System.out.println(s);
podminka = true;
}
c++;
d--;
}
}
}
试试这个!字符串计数从0开始!