Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java编程挑战代码不工作_Java - Fatal编程技术网

Java编程挑战代码不工作

Java编程挑战代码不工作,java,Java,我在Java方面遇到了一个挑战,其中一个问题我一直得到错误的答案,这个问题是: 两个2位数或1位数的乘积的所有回文数的总和是多少 编辑: 所以我基本上需要代码来计算所有回文的总和,这些回文可以由2位数字或1位数字组成 package projects; import java.util.ArrayList; public class Project3 { public static void main(String[] args) { new Project3();

我在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;
    }


}
成套项目;
导入java.util.ArrayList;
公共类项目3{
公共静态void main(字符串[]args){
新项目3();
}
公共项目3(){
ArrayList编号=新的ArrayList();
//生成1-9
对于(int i=1;i<10;i++){
增加(i);
}
//生成11-99
对于(int i=10;i<100;i+=10){
增加(i+(i/10));
}
//生成100-999
对于(int i=100;i<1000;i+=100){
对于(int j=1;j<10;j++){
增加(i+(j*10)+(i/100));
}
}
//生成1000-9999
对于(int i=1000;i<10000;i+=1000){
对于(int j=1;j<10;j++){
添加(i+(j*100)+(j*10)+(i/1000));
}
}
布尔乘积=假;
对于(int i=0;i=1;j--){
if(numbers.get(i).intValue()%j==0){
产品=真;
打破
}
}
如果(产品==假){
删除(i);
}
}
int-total=0;
对于(int i=0;i=0;x--){
反向+=数组[x];
}
反向返回;
}
}
编辑:


我想问一下我的程序出了什么问题/哪里出了问题,我能做些什么才能得到一个正确答案的程序。

只有一个潜在问题:

for(int i = 0; i < numbers.size(); i++){
  ...
  if(product == false){
    numbers.remove(i);
  }
}
for(int i=0;i
这可能会跳过数字。考虑列表<代码> n,p,*< /代码>(其中代码< n>代码>是非产品PaldRoMe,<代码> P<代码>是产品回文,<代码> */COD>是任意回文。i是0,因为N是非乘积回文,它将被删除,您的列表现在是
P,*
。现在我将增加到1,因此第i个元素是
*
<代码>P
将被跳过-哎哟

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

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

第三种选择是使用迭代器,例如,
for(迭代器itr=numbers.iterator();itr.hasNext();){…}
然后
itr.next()
itr.remove()

顺便说一句,每当
i
的值不相关时,您可能希望将其用于foreach循环,例如
for(Integer number:numbers)

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

编辑2:我将示例更改为更抽象的内容,以避免(或生成?;)进一步混淆。因为我现在想不出一个非乘积回文后跟乘积回文的序列(
product
这里的意思是匹配两个一位数或两位数的乘积的要求),所以我把它改为
N,P,*


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

你尝试创建所有回文数,然后检查它们是否是某些数字的乘积。相反,尝试另一种方法。您已经有了一个
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++;
    }
}
int计数器=0;
对于(int i=0;i<100;i++){
对于(int k=i;k<100;k++){
String s=String.valueOf(i*k);
如果(s.equals(reverse(s)))计数器++;
}
}

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

 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位数字。 你必须消除所有这种情况


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

您希望得到什么,得到什么?你调试过你的代码吗?只需创建所有可能的1位和2位数字的乘积(不是那么多),并检查它们是否是回文的?关键的是,这不是一个问题。你没有在任何地方问过问题(也没有表现出任何理解问题的尝试)。转储一堆代码是不够的。我不认为arraylist“numbers”中存在数字10。@Isp这只是一个抽象示例,您也可以使用
65,66,67
。)是的,我明白你在文章中的意思,但是数组只包含回文,而as 65,67不包含回文。@Isp是的,我会再编辑一次。非常感谢你