我遇到了一个挑战,用Java做了一个问题,其中一个问题是我一直得到错误答案的问题是:
两个2位数或1位数的乘积的所有回文数的总和是多少?
编辑: 因此,我基本上需要能够计算所有回文总和的代码,这些回文可以由2位数字或2位数字组成。
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;
}
}
编辑:
我想知道我的程序出错了什么/哪里,以及我能做些什么来得到一个能给我正确答案的程序。
答案 0 :(得分: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位数。 你必须消除所有这些情况。
因此,如果您按照上面几个用户所提到的相反方式遵循算法,那么不要使用此算法。
答案 1 :(得分:1)
只有一个潜在的问题:
for(int i = 0; i < numbers.size(); i++){
...
if(product == false){
numbers.remove(i);
}
}
这可能会跳过数字。考虑列表N,P,*
(其中N
是非产品palidrome,P
是产品回文,*
是任何回文。我是0,因为N是非产品palidrome,它将被删除,你的列表现在是P,*
。现在我将增加到1,因此第i个元素是*
。 { - 1}}将被跳过 - 哎哟。
要解决这个问题,您可以将回文收集到另一个集合/列表/集合中,并保持P
不变。
或者向后迭代,即numbers
。
三分之一的选择是使用迭代器,例如for( i = numbers.size(); i >= 0; i--)
然后for( Iterator<Integer> itr = numbers.iterator(); itr.hasNext(); ) { ... }
和itr.next()
。
顺便说一句,每当itr.remove()
的值不相关时,您可能希望使用foreach循环,例如: i
修改:将示例从for(Integer number : numbers )
更改为10,11,12
以减少混淆。请注意,它仍然是一个示例,不一定基于您的实际数据。
编辑2 :我将示例更改为更抽象的内容以避免(或生成?;))进一步混淆。由于我现在无法想到一个非产品回文序列,后面是产品回文(65,66,67
这里意味着匹配作为2个一位或两位数字的乘积的要求),我改变了它到product
。
我将重申潜在错误答案的重点:当您使用索引向前迭代并删除当前或较低索引处的元素时,您将跳过元素,所以不要这样做除非你想要那种确切的行为。
答案 2 :(得分: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++;
}
}