-6

我在使用 Java 方面遇到了挑战,我一直得到错误答案的问题之一是:

作为两个 2 位或 1 位数字的乘积的所有回文数的总和是多少?

编辑:所以我基本上需要代码来计算所有回文数的总和,这些回文数可以由 2 个数字或 1 位数字组成。

package projects;

import java.util.ArrayList;

public class Project3 {

    public static void main(String[] args) {
        new Project3();
    }

    public Project3(){
        ArrayList<Integer> numbers = new ArrayList<Integer>();

        //generate 1-9
        for(int i = 1; i < 10; i++){
            numbers.add(i);
        }

        //generate 11-99
        for(int i = 10; i < 100; i+=10){
            numbers.add(i + (i / 10));
        }

        //generate 100-999
        for(int i = 100; i < 1000; i+=100){
            for(int j = 1; j < 10; j++){
                numbers.add(i + (j*10) + (i / 100));
            }
        }

        //generate 1000 - 9999
        for(int i = 1000; i < 10000; i+=1000){
            for(int j = 1; j < 10; j++){
                numbers.add(i + (j * 100) + (j * 10) + (i / 1000));
            }
        }

        boolean product = false;

        for(int i = 0; i < numbers.size(); i++){
            product = false;
            for(int j = 99; j >= 1; j--){
                if(numbers.get(i).intValue() % j == 0){
                    product = true;
                    break;
                }
            }
            if(product == false){
                numbers.remove(i);
            }
        }

        int total = 0;

        for(int i = 0; i < numbers.size(); i++){
            total += numbers.get(i);
            System.out.println(numbers.get(i) + "\t\t" + total);
        }

        System.out.println(total);
    }

    public String reverse(String thing){
        String reversed = "";
        char[] array = thing.toCharArray();
        for(int x = thing.length() - 1; x >= 0; x--){
            reversed += array[x];
        }
        return reversed;
    }


}

编辑:

我想问我的程序出了什么问题/哪里出了问题,以及我可以做些什么来获得一个能给我正确答案的程序。

4

3 回答 3

2

当您在以下循环中检查可分性时,您的逻辑出错了:

 for(int j = 99; j >= 1; j--){
            if(numbers.get(i).intValue() % j == 0){
                product = true;
                break;
            }

在这里,您只是检查回文是否可以被 1-99 之间的数字整除,但您并不担心回文的其他因素。

示例: 让回文数为 2222。当检查它的可分性时(在“j”循环内),它可以被 22 整除,因此您将它包含在列表中,而另一个因素是 101,它不是 2 位数字/1 位数字。您必须消除所有此类情况。

因此,与其遵循该算法,不如按照上面少数用户提到的相反方式遵循该算法。

于 2013-10-09T12:20:33.613 回答
1

只有一个潜在的问题:

for(int i = 0; i < numbers.size(); i++){
  ...
  if(product == false){
    numbers.remove(i);
  }
}

这可能会跳过数字。考虑列表N,P,*(其中N是非产品回文,P是产品回文并且*是任何回文)。i 为 0,并且由于 N 是非产品回文,它将被删除,您的列表现在是P,*. 现在 i 将增加到 1,因此第 i 个元素是*P将被跳过 - 哎哟。

为了解决这个问题,您可以将回文收集到另一个集合/列表/集合中并numbers保持不变。

或者向后迭代,即for( i = numbers.size(); i >= 0; i--)

第三个选项是使用迭代器,例如for( Iterator<Integer> itr = numbers.iterator(); itr.hasNext(); ) { ... },然后itr.next()itr.remove()

i顺便说一句,只要值不相关,您可能希望使用 foreach 循环,例如for(Integer number : numbers )

编辑:将示例从更改10,11,1265,66,67以减少混淆。请注意,这仍然是一个示例,不一定基于您的实际数据。

编辑2:我将示例更改为更抽象的内容,以避免(或产生?;))进一步混淆。由于我目前无法想到非乘积回文后跟乘积回文的序列(product这里意味着匹配成为 2 个一位或两位数字乘积的要求),我将其更改为N,P,*.

我将重申我的潜在错误答案的要点:当您使用索引向前迭代并删除当前或较低索引处的元素时,您会跳过元素,所以除非您想要那种确切的行为,否则不要这样做。

于 2013-10-09T11:59:06.590 回答
1

您尝试创建所有回文数,然后检查它们是否是某些数字的乘积。相反,请尝试相反的方式。您已经有一个reverse函数,所以只需执行以下操作:

int counter = 0;
for (int i = 0; i < 100; i++) {
    for (int k = i; k < 100; k++) {
        String s = String.valueOf(i * k);
        if (s.equals(reverse(s))) counter++;
    }
}
于 2013-10-09T12:05:39.953 回答