一个java编程问题

123456789 九个数分别组成3个3位数,其中两个相加等于第三个。编程求出这些三位数有那些
最好把构思也说下

参考别人类似九个数的问题的算法修改得到的,因为完全处理int型,所以效率很高,运行速度很快,不过总觉得还有改进之处

public class NinePuzzle {

public static void solve() {
int a[] = new int[10];
int s;
int k;
// 123456789组成的三位数中最小的为123,最大的为987
// 因此也就是两数之和最大为987,因此使第一个数从123
// 开始递增,第二个数从987-123=864开始递减,为避免重复
// i递增上限为494,j的递减下限为495
for (int i = 123; i <= 494; i++) {
// i从9个数组成的三位数中最小的数123开始
for (int j = 864; j > 494; j--) {
// j从864开始.
for (int h = 1; h < 10; h++)
a[h] = 0;
k = i + j;
// k为i和j的和.但是也不能大于987
if (k < 987) {
a[i / 100] = 1;
a[i / 10 % 10] = 1;
a[i % 10] = 1;
a[j / 100] = 1;
a[j / 10 % 10] = 1;
a[j % 10] = 1;
a[k / 100] = 1;
a[k / 10 % 10] = 1;
a[k % 10] = 1;

s = 0;
for (int h = 1; h < 10; h++)
s = s + a[h];
if (s == 9)
System.err.printf("i=%d,j=%d,k=%d\n", i, j, k);
}
}
}
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
solve();//调用函数
}
}

参考资料:http://zhidao.baidu.com/question/14846290.html

温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-08-13
理路大致是这样的... 组合数比较难
public class MathProblem
{
/**
* 求抽取3个3个3个全排列
*/
public List getRandNumber(){

}

/**
* 判断条件获取结果
*/
public List getResult(){

}

}

我也没写出来给你一个求全排的java代码:
public class Test1
{
public static void main(String args[])
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
Array( a, 0, 3);//第二个参数已定为0,第三个参数表示数组中有几位数参与排列

}

public static void Array( int a[], int count, int max )//cout表示第几位数排列完成
//max表示有几个数参与排列
{
if ( count == max - 1 ) //若数组中全部排完时
{
for ( int i = 0; i < max; i++ )
System.out.print( a[i] + " " );
System.out.println();
}
else
{
int b[] = new int[ max ]; //创建新数组,用于递归
for ( int i = 0; i < count; i++ ) //将前面确定的书存入新数组
b[ i ] = a[ i ];

int k = count;
for ( int i = count; i < max; i++ )
{
b[ k++ ] = a[ i ]; //选择一个数,存入
for ( int j = count; j < max; j++ ) //选择不重复的数,依次存入
{
if ( i != j )
b[ k++ ] = a[ j ];

}
k = count;

Array( b, count + 1, max ); //递归
}
}
}

}
第2个回答  2009-08-13
public class TestSun {
public static void main(String[] args) {
String s = "100200300";
String s1 = null;
String s2 = null;
String s3 = null;
int num = 0;

for(int i = 0; i < s.length(); i+=3) {
num++;
if(num == 1) {
s1 = s.substring(i, i+3);
}
if(num == 2) {
s2 = s.substring(i, i+3);
}
if(num == 3) {
s3 = s.substring(i, i+3);
}
}

int i1 = Integer.valueOf(s1);
int i2 = Integer.valueOf(s2);
int i3 = Integer.valueOf(s3);;

if((i1 + i2 == i3)||(i1 + i3 == i2)||(i1 - i2 == i3)) {
System.out.println("true");
}
else {
System.out.println("false");
}
}
}

我刚学`现在程度最高就只能写出这样了`而且也只能限制于9位数的判断
中间有些用switch语句也可以 但是考虑只有3次 这样写比较方便`不要喷我我刚学`只有这样的程度 在考虑把STRING转换成INT的时候 一时没想到Integer.valueOf(String)这个方法` 还转换成字符数组`麻烦个半死`现在改了下
说下思路 就是用substring分离出来3个数组 然后转换成INT 再进行判断 如果题目改成某个数的话`那可能我的程度的话还要更麻烦点`不好意思`只能给你参考了`
String s = new String(args[0])或者用这个 在 java TestSun 100200300这样输入吧。。实在抱歉我除了在InputStream里面用System.in 其他还不会`还没研究出来`
第3个回答  2009-08-14
public class Plus {

public static void main(String[] args) {

int m,n,z;

for(int i =123 ; i <=987 ; i++){
for(int j = 123 ; j <= 987 ; j++){
for(int k = 123 ; k <= 987 ; k ++){
if( k == (i+j) ){
m=i;n=j;z=k; //到这里求出123到987之间 2数相加且小于987的3个数

if(getCharA(m,n,z)){
if(Same(m) && Same(n) && Same(z)){
System.out.println(m+" "+" "+n+" "+z);
}
}
}
}
}
}
}
// 3个3位数里没有相同数字
public static boolean getCharA(int x , int y , int a){

String s1 , s2 ,s3 ;
char []a1;
char []a2;
char []a3;
s1 = String.valueOf(x);
a1 = (s1.toCharArray());
s2 = String.valueOf(y);
a2 = (s2.toCharArray());
s3 = String.valueOf(a);
a3 = (s3.toCharArray());
for(int i = 0 ; i < 3 ; i++) {
for(int j = 0 ; j < 3 ; j ++){
for(int k = 0 ; k < 3 ; k ++){
if( (a1[i] == a2[j]) || (a1[i] == a3[k]) || (a2[j] == a3[k])){
return false ;
}

}
}
}

return true ;

}
// 每个3位数里没有相同数字且不包含0..
public static boolean Same(int b){
char []c;
String s1 ;
s1 = String.valueOf(b);
c = (s1.toCharArray());
if((c[0]==c[1]) ||(c[0]==c[2]) || (c[2]==c[1]) || c[0] == '0' ||
c[1] == '0' || c[2] == '0'){
return false;
}
return true ;
}

}

代码是笨了一点,复杂了一点- - 但是好歹写出来了.....
第4个回答  2009-08-13
厉害。强大。 不能重复吧,不然怎么刚好9个数,3个3位数。
这个得想个好算法,按规律排序得算太久了。
没想出好方法。明天再想想。
第5个回答  2009-08-13
好写就是复杂 乱点
相似回答
大家正在搜