使用数组列表获取错误的输出

Pro*_*usH 13 java arrays string algorithm arraylist

面临的挑战是找到一个数字,该数字的各个数字乘以连续增加的幂并相加,等于初始数字。

例如:取89,将其分为8和9,然后 8^1 + 9^2 = 89

static List<Integer> sumDigPow(int a, int b) { 
        List<Integer> eureka = new ArrayList<Integer>(0);
        List<String> digits = new ArrayList<String>();
        String num;
        int sum = 0, multi;

    for (int i=a; i<=b; i++) {
        num = String.valueOf(i);
        digits.add(num);

        for (int j=0; j<digits.size(); j++) {
                multi = (int)Math.pow(Integer.parseInt(digits.get(j)), j+1);
                sum += multi;
        }

        if (sum == i) eureka.add(i);

        sum = 0;
        digits.clear();
    }

    return eureka;
}
Run Code Online (Sandbox Code Playgroud)

输入1和100(范围)时,输出应为[1、2、3、4、5、6、7、8、9、89],但是我得到了所有数字[1, 2 ... 100]。

我是最近才开始学习Java的,似乎无法在代码中找到问题。任何提示将不胜感激。

Nic*_*s K 6

您可以使用以下内容:

static List<Integer> sumDigPow(int a, int b) {
    List<Integer> eureka = new ArrayList<Integer>(0);
    String num;
    int sum = 0, multi;

    for (int i = a; i <= b; i++) {
        num = String.valueOf(i);
        for (int j = 0; j < num.length(); j++) {
            multi = (int) Math.pow(Character.getNumericValue(num.charAt(j)), j + 1);
            sum += multi;
        }

        if (sum == i) {
            eureka.add(i);
        }
        sum = 0;
    }
    return eureka;
}
Run Code Online (Sandbox Code Playgroud)

说明:

  1. 您没有检查数字的第二位数字。
  2. 循环遍历String的 每个字符num
  3. 不需要digitsarraylist,您只需使用char 的数值即可


Mar*_* R. 5

使用char[]的号码拆分成数字作为字符数组(你是刚刚加入数字作为一个字符串到列表中,而不是它的单个数字):

...
    char[] digits;
...
    digits = String.valueOf(i).toCharArray();
Run Code Online (Sandbox Code Playgroud)

然后,如果您'0'从每个char数字中减去,您将自动获得数字的实际int值,而不必调用Integer.parseIntString上的方法或任何其他解析方法:

    (int)Math.pow(digits[j] - '0', j + 1);
Run Code Online (Sandbox Code Playgroud)

完整的代码如下所示:

static List<Integer> sumDigPow(int a, int b) {
    List<Integer> eureka = new ArrayList<Integer>();
    int sum = 0;
    char[] digits;

    for (int i = a; i <= b; i++) {
        digits = String.valueOf(i).toCharArray();
        for (int j = 0; j < num.length(); j++) 
            sum += (int)Math.pow(digits[j] - '0', j + 1);

        if (sum == i) eureka.add(i);
        sum = 0;
    }
    return eureka;
}
Run Code Online (Sandbox Code Playgroud)