当前位置:编程学习 > JAVA >>

求救大神!!!!!!!!!!!!!!!!!!!!不知道哪里出现错误

题目用1到9组成3个三位数(每个数字只能用一次),使其中两个数的和等于第三个数


要求数组方法,输出所有满足条件的等式(如124 + 659 = 783
125 + 739 = 864) 
我自己写的
import java.util.* ;
public class ArrayTest {
public static void main(String[] args){
int[] arr = new int[9*8*7];
int i , j , k , x = 0 ;
for(i = 1 ; i < 10 ; i ++){
for(j =1 ; j < 10 ; j ++){
if(j == i){
continue ;
}
for(k = 1; k < 10 ; k ++){
if(k == j||k==i){
continue ;
}
arr[x] = 100*i+10*j+k ;
x ++ ;
}
}
}
for(int a = 0 ; a <= arr.length ; a ++){
for(int b = 0 ; b <= arr.length ; b ++){
for(int c = 0 ; c <= arr.length ; c ++){
if((arr[a]+arr[b])==arr[c]){
         System.out.print(arr[a]+"+"+arr[b]+"="+arr[c]);
}

}
}
}
}
}

输出异常123+123=246Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 504
at ArrayTest.main(ArrayTest.java:23)
--------------------编程问答-------------------- 你这错误很低级,数组下标越界,怪不得没有大神。
不过这不是最低级的,貌似你没读懂题目的意思。
--------------------编程问答-------------------- a <= arr.length
b <= arr.length
c <= arr.length
你的问题就出在这里的"="上面,下标值等于数组长度的时候就越界了,写成小于就可以了
a < arr.length
b < arr.length
c < arr.length

粗心了吧 --------------------编程问答-------------------- arr.length-1 --------------------编程问答--------------------
public class Test {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
arrange(arr, 8);
}

public static void arrange(int[] arr, int n) {
if (n == 0) {
return;
} else {
for (int i = 0; i < n; i++) {
swap(arr, i, n);
arrange(arr, n - 1);
if (n == 1) {
istrue(arr);
}
swap(arr, i, n);
}
arrange(arr, n - 1);
if (n == 1) {
istrue(arr);
}
}
}

public static void swap(int[] arr, int i, int j) {
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;

}

public static void istrue(int[] arr) {
int num1 = arr[0] * 100 + arr[1] * 10 + arr[2];
int num2 = arr[3] * 100 + arr[4] * 10 + arr[5];
int num3 = arr[6] * 100 + arr[7] * 10 + arr[8];
if (num1 + num2 == num3) {
System.out.println(num1 + "+" + num2 + "=" + num3);
}
}
}
--------------------编程问答-------------------- 貌似你数组越界了诶 --------------------编程问答-------------------- 就是求出array[9]的全排列,然后一个个验证的意思么。。 --------------------编程问答-------------------- 我使用List集合实现了一个,可能比起4楼的代码有点多,但总归是实现了,分享出来,供大家参考,不足的地方欢迎大家指正:
import java.util.ArrayList;
import java.util.List;

/**
 * 用1到9组成3个三位数(每个数字只能用一次),使其中两个数的和等于第三个数
 * 
 * @author Administrator
 * 
 */
public class SumTest {
public static void main(String[] args) {
SumTest test = new SumTest();
/*
 * 第一个数的集合
 */
List<Integer> list = test.generateNumber();
/*
 * 第二个数的集合
 */

List<Integer> copyList = new ArrayList<Integer>();
copyList.addAll(list);
/*
 * 所有和的集合
 */
List<Integer> sumList = new ArrayList<Integer>();
sumList.addAll(list);
/*
 * 检查并输出满足要求所有数字
 */
test.checkAllNumber(list, copyList, sumList);

}

/**
 * 得到一个集合,这个集合中包含了由1-9组成的三位数。并且每个三位数每一位都不重复
 * 
 * @return
 */
public List<Integer> generateNumber() {
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 10; i++) {
for (int j = 1; j < 10; j++) {
if (i == j) {
continue;
}
for (int k = 1; k < 10; k++) {
if (i == k || j == k) {
continue;
}
list.add(Integer.parseInt(i + "" + j + "" + k));
}
}
}
return list;
}

/**
 * 检查三个数,保证三个数每一位都不相同
 * 
 * @param number1List
 *            第一个数
 * @param number2List
 *            第二个数
 * @param sumList
 *            第三个数
 */
public void checkAllNumber(List<Integer> number1List,
List<Integer> number2List, List<Integer> sumList) {
for (int i = 1; i < number1List.size(); i++) {
for (int j = 1; j < number2List.size(); j++) {
if (!checkNumber(number1List.get(i), number2List.get(j))) {
continue;
}
for (int k = 1; k < sumList.size(); k++) {
if (!checkNumber(number1List.get(i), sumList.get(k))
|| !checkNumber(number2List.get(j), sumList.get(k))) {
continue;
}
outputNumber(number1List.get(i), number2List.get(j),
sumList.get(k));
}
}
}
}

/**
 * 检查两个数,保证两个数每一位都不相同
 * 
 * @param number
 * @param number2
 * @return 如果有一位相同,返回<code>false</code>, 否则,返回<code>true</code>
 */
public boolean checkNumber(int number, int number2) {
String n1 = number + "";
String n2 = number2 + "";
if (n1.length() != n2.length()) {
return false;
}
for (int i = 0; i < n1.length(); i++) {
for (int j = 0; j < n2.length(); j++) {
if (n1.charAt(i) == n2.charAt(j)) {
return false;
}
}
}
return true;
}

/**
 * 如果<code>number1+number2=sum</code>, output.<br>
 * output format:<code>number1+number2=sum</code> such as:
 * <code>752+184=936</code>
 * 
 * @param number1
 *            第一个数
 * @param number2
 *            第二个数
 * @param sum
 *            和
 */
public void outputNumber(int number1, int number2, int sum) {
if (number1 + number2 == sum) {
System.out.println(number1 + "+" + number2 + "=" + sum);
}
}

}
--------------------编程问答-------------------- 特别说明:中间有点绿色的并不是注释掉了,可能是csdn的识别器出了问题,大家可以把代码直接粘进自己的IDE进行查看, --------------------编程问答--------------------
public class Miooo {
public static void main(String[] args) {
new Miooo().f(0);
}

private final int M = 9;
private int[] list = new int[M];
private int num = 0;

private void f(int n) {
if (n == M) {
print();
} else {
for (int i = 1; i <= M; i++) {
if (!has(n, i)) {
list[n] = i;
f(n + 1);
}
}
}
}

private boolean has(int n, int i) {
for (int k = 0; k < n; k++)
if (list[k] == i)
return true;
return false;
}

private void print() {
int a = list[0] * 100 + list[1] * 10 + list[2];
int b = list[3] * 100 + list[4] * 10 + list[5];
int c = list[6] * 100 + list[7] * 10 + list[8];
if ((a + b) != c)
return;
System.out.println(num++ + ":" + a + "+" + b + "=" + c);
}
}
--------------------编程问答-------------------- 楼主是学C语言的吧 --------------------编程问答--------------------
引用 1 楼 qq525003138 的回复:
你这错误很低级,数组下标越界,怪不得没有大神。
不过这不是最低级的,貌似你没读懂题目的意思。
确实……应该是全排分开3个数字再验证 --------------------编程问答-------------------- 从上层C语言起步的吧 --------------------编程问答-------------------- 数组越界!输出的写成分行显示
/**2013-8-28Demo.javaAdministrator
 * 
 */
package com.lori_xj.test;

/**
 * TODO
 * 
 * @author
 * @date2013-8-28
 */
public class Demo {
 public static void main(String[] args){
        int[] arr = new int[9*8*7];
        int i , j , k , x = 0 ;
        for(i = 1 ; i < 10 ; i ++){
            for(j =1 ; j < 10 ; j ++){
                if(j == i){
                    continue ;
                }
                for(k = 1; k < 10 ; k ++){
                    if(k == j||k==i){
                        continue ;
                    }
                    arr[x] = 100*i+10*j+k ;
                    x ++ ;
                }
            }
        }
        for(int a = 0 ; a < arr.length ; a ++){
            for(int b = 0 ; b < arr.length ; b ++){
                for(int c = 0 ; c <arr.length ; c ++){
                    if((arr[a]+arr[b])==arr[c]){
                     System.out.println(arr[a]+"+"+arr[b]+"="+arr[c]);
                    }
                 
                }
            }
        }
    }
}
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,