使用int上的数组检查回文,帮助(在数组int中存储long的数字)

时间:2014-08-12 17:46:58

标签: java arrays int long-integer palindrome

这是我编写的一些代码,用于检查long是否是回文,使用整数数组。我这样做是为了测试我的技能,(失败)所以不要评论更好的方法来检查一个数字是否是回文。

import java.util.Scanner;

public class digextester {
    static Scanner input = new Scanner(System.in);

    public static void main(String[] args) {
        String in = input.nextLine();
        long im = Long.valueOf(in).longValue();
        System.out.println(im);
        thing(im);
    }

    public static void thing(long im) {
        int l = 0;
        while (im > 0) {
            im = im / 10;
            l++;
        }
        System.out.println(l);
        int arrim[] = new int[l];
        for (int c = 1; c <= l; c++) {
            arrim[c] = ((int) (im - (im / 10) * 10)); // also tried = im%10
            im = im / 10;
        }
        int e = 1;
        int d = 0;
        while (e < (l / 2)) {
            if (arrim[e] == arrim[(l - e) + 1]) {
                d = 0;
            } else {
                d = 20;
                e = l;
            }
            e++;
        }
        if (d == 0) {
            System.out.println("pal");
        } else {
            System.out.println("not pal");
        }
    }
}

这是我在线程&#34; main&#34;:

中得到的例外
java.lang.ArrayIndexOutOfBoundsException: 5
    at digextester.thing(digextester.java:27) - arrim[c] = ((int)(im-(im/10)*10)) ;
    at digextester.main(digextester.java:12) - thing(im);

有人可以解释导致此异常的原因吗?

4 个答案:

答案 0 :(得分:2)

您的异常是由于数组索引从0到长度-1,而不是从1到长度(即arrim[c]导致ArrayIndexOutOfBoundsException时出现c == l异常。< / p>

此外,我还会从im % 10中提取长度最低的数字。

答案 1 :(得分:1)

首先,代码中存在逻辑错误。在你的方法

public static void thing(long im)

我建议你加上:

long temp = im;

并在for循环中,更改

arrim[c] = ((int) (im - (im / 10) * 10));

arrim[c] = ((int) (temp - (temp / 10) * 10));

如果您不这样做,您输入的每个数字都将显示为回文。

现在是例外。

在代码的这个片段中,

for (int c = 1; c <= l; c++) {
arrim[c] = ((int) (im - (im / 10) * 10)); // also tried = im%10
im = im / 10;
}

首先改为

for (int c = 0; c < l; c++) 

然后在这部分,

int e = 1;
    int d = 0;
    while (e < (l / 2)) {
        if (arrim[e] == arrim[(l - e) + 1]) {
            d = 0;
        }

变化

int e = 1

int e = 0;

if (arrim[e] == arrim[(l - e) + 1])

if (arrim[e] == arrim[(l - e) - 1])

然后代码应该正常工作:)

说明:正如其他答案所示,你在for循环中使c = 1而不是c = 0导致异常。

这是因为,例如。如果输入的数字是1111,则变量l = 4的值,因此数组大小为4即。 arrim [0]到arrim [3]。

在你说c = 1到c&lt; = l(这里是4)的for循环中,你试图给arrim [1],arrim [2],... arrim [4]和arrim [赋值] 4]不存在。这会导致异常。

在第二部分你做了

int e = 1

if (arrim[e] == arrim[(l - e) + 1])

这会导致异常。

例如,如果输入的数字再次为1111,那么变量l = 4的值。

arrim [0] = 1,arrim [1] = 1,....,arrim [3] = 1.

但在if声明中, arrim [1] == arrim [(4 - 1)+ 1)] ie。 当没有arrim [4]时,正在检查arrim [1] == arrim [4]。 这显然是例外。

答案 2 :(得分:0)

一种替代实施方式: TestPalindrome类

package com.example.palindrome;

import java.util.Scanner;

public class TestPalindrome {
    private static TestPalindrome me;
    Scanner input;

    public static void main(String[] args) {
        me = new TestPalindrome();
        me.doWork();
    }

    private void doWork() {
        input = new Scanner(System.in);
        System.out.println("Enter number or Q to Quit");
        String inputValue = input.nextLine();
        while (inputValue != "Q") {
            long candidate = Long.valueOf(inputValue).longValue();
            boolean palindromatic = Palindrome.isPalindrome(candidate);
            System.out.println("Number " + candidate + " palindromatic ? "
                    + palindromatic);
            System.out.println("Enter number or Q to Quit");
            inputValue = input.nextLine();
        }
    }
}

回文类

package com.example.palindrome;

public class Palindrome {

    public static boolean isPalindrome(long number) {
        long reverse = 0;
        long value = number;

        while (value > 0 ) {
            long nextNumber = value / 10;
            long digit = value - nextNumber*10;
            reverse = reverse * 10 + digit;
            value = nextNumber;
        }
        return number == reverse;
    }
}

答案 3 :(得分:0)

你的阵列&#34; arrim&#34;仅被初始化为1的大小...意味着唯一有效的数组元素的索引为0 ...(arrim [0])。请记住,数组索引从0开始。有关数组的详细信息,请查看此处:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

因此,直接来说,您的例外情况来自以下内容:

你的循环:

for (int c = 1; c <= l; c++) {
    arrim[c] = ((int) (im - (im / 10) * 10)); // also tried = im%10
    im = im / 10;
}

...首先设置&#34; c&#34;值为1.然后传递终止测试c<=1并进入循环。 尝试访问arrim[c]的循环的第一行 - 我们知道arrim[1]。鉴于我们知道arrim数组只包含一个元素,位于arrim [0]位置,任何访问arrim元素的尝试都不是在索引&#39; 0&#39;将导致ArrayIndexOutOfBoundsException

ArrayIndexOutOfBoundsException是java编程中常见的错误异常,你可以阅读这里的细节:http://docs.oracle.com/javase/7/docs/api/java/lang/ArrayIndexOutOfBoundsException.html。异常的长短归结为:您尝试使用无效的数组索引(小于零或大于.length-1)