笔试编程题

从1到19共19个整数,请打印出利用这19个整数任意多个相加结果等于20的所有可能性,每个数字在同一算式中只出现一次。
如:
1+19
1+2+17
1+2+3+14
1+2+3+4+10
......
3+4+6+7
3+5+12
3+6+11
但是1+19和19+1数字位置交换算同一个算式,只能出现一次

public class Stack { //定义自己的栈
int[] data;
int position; //栈顶位置,空栈时为-1
public Stack(){
data=new int[6];
position=-1;
}

public void put(int i) { //入栈
data[++position]=i;
}

public int port() { //出栈,返回int
int t=data[position];
position--;
return t;
}

public boolean isEmpety() { //判断是否为空
return position==-1? true:false;
}

public void print() { //打印符合情况
for(int i=0;i<=position;i++) {
System.out.print(data[i]+"+");
}
System.out.println();
}
public static void main(String[] args) {
Stack stack=new Stack(); //实例一个我们的栈来用
int total=0; //记录栈内的数据之和
int j=1;
stack.put(1); //先把1压入栈中,从1开始,下一行total=1
total+=1;
while(j if(total==20) { //关键是这里,当我们满足情况时,先打印。应该出栈两次,因为已经和为20了,若出一个,再往后肯定>20,所以出2个,并将第二次出栈的数+1压入栈,可能还有情况
stack.print();
int m=stack.port(); //出栈
int n=stack.port(); //出栈 ,当然n total-=m;
total-=n;
if(stack.isEmpety()&&n==9) break; //当栈底为9时,已经没有了,因为10+11至少为21了,后面没必要判断了,所有情况都已包括
else{
j=n+1;
stack.put(j);
total=total+j;
}
}else
if(total>20) {//这里几乎和上面一样,只是没打印,应该封装起来,会减少代码
int m=stack.port();
int n=stack.port();
total-=m;
total-=n;
if(stack.isEmpety()&&n==9) break;
else{
j=n+1;
stack.put(j);
total=total+j;
}
}else{
stack.put(++j);
total+=j;
}
}
}
}

朋友,你可以按栈原理大致模拟一下,当你模拟一次两次成功时,你就弄懂了规律!加油!

我用了个笨方法,是初学者~,多担待 :D 。再想办法简化就好了。代码如下:
class A
{
void sum()
{
int i,j;
for(i=19;i>0;i--)
{
for(j=1;j<=i-1;j++)
{
if(i+j==20)
{
System.out.println(""+i+"+"+j);

                 break;
             }
             }
        }

}

}
class B
{
void sum()
{
int i,j,k;
for(i=19;i>0;i--)
{
for(j=1;j<=i-1;j++)
{

for(k=1;k<=j-1;k++)
{
if(i+j+k==20)
{
System.out.println(""+i+"+"+j+"+"+k);

             break;
         }
         }
         }
    }
}

}
class C
{
void sum()
{
int i,j,k,m;
for(i=19;i>0;i--)
{
for(j=1;j<=i-1;j++)
{

for(k=1;k<=j-1;k++)
{
for(m=1;m<=k-1;m++)
{
if(i+j+k+m==20)
{
System.out.println(""+i+"+"+j+"+"+k+"+"+m);

             break;
         }
         }
         }
    }
}
}

}
class D
{
void sum()
{
int i,j,k,m,n;
for(i=19;i>0;i--)
{
for(j=1;j<=i-1;j++)
{

for(k=1;k<=j-1;k++)
{
for(m=1;m<=k-1;m++)
{
for(n=1;n<=m-1;n++)
{
if(i+j+k+m+n==20)
{
System.out.println(""+i+"+"+j+"+"+k+"+"+m+"+"+n);

             break;
         }
         }
         }
    }
}
}
}

}
public class test6 {

/**
 * @param args
 */
//@SuppressWarnings("null")
public static void main(String[] args) {
    // TODO Auto-generated method stub


    A get=new A();
    get.sum();
    B get1=new B();
    get1.sum();
    C get2=new C();
    get2.sum();
    D get3=new D();
    get3.sum();
}

}

麻烦一点,不过利用栈很容易实现,你参考一下吧!

public class Stack {
int[] data;
int position;
public Stack(){
data=new int[6];
position=-1;
}

public void put(int i) {
    data[++position]=i;
}

public int port() {
    int t=data[position];
    position--;
    return t;
}

public boolean isEmpety() {
    return position==-1? true:false;
}

public void print() {
    for(int i=0;i<=position;i++) {
        System.out.print(data[i]+"+");
    }
    System.out.println();
}
public static void main(String[] args) {
    Stack stack=new Stack();
        int total=0;
        int j=1;
        stack.put(1);
        total+=1;
        while(j<20) {
             if(total==20) {
                 stack.print();
                 int m=stack.port();
                 int n=stack.port();
                 total-=m;
                 total-=n;
                 if(stack.isEmpety()&&n==9) break;
                 else{
                     j=n+1;
                     stack.put(j);
                     total=total+j;
                 }
             }else
            if(total>20) {
                 int m=stack.port();
                 int n=stack.port();
                 total-=m;
                 total-=n;
                 if(stack.isEmpety()&&n==9) break;
                 else{
                     j=n+1;
                     stack.put(j);
                     total=total+j;
                 }
            }else{
                stack.put(++j);
                total+=j;
            }
        }
 }

}

对了,这是我的运行结果,完全符合
1+2+3+4+10+
1+2+3+5+9+
1+2+3+6+8+
1+2+3+14+
1+2+4+5+8+
1+2+4+6+7+
1+2+4+13+
1+2+5+12+
1+2+6+11+
1+2+7+10+
1+2+8+9+
1+2+17+
1+3+4+5+7+
1+3+4+12+
1+3+5+11+
1+3+6+10+
1+3+7+9+
1+3+16+
1+4+5+10+
1+4+6+9+
1+4+7+8+
1+4+15+
1+5+6+8+
1+5+14+
1+6+13+
1+7+12+
1+8+11+
1+9+10+
1+19+
2+3+4+5+6+
2+3+4+11+
2+3+5+10+
2+3+6+9+
2+3+7+8+
2+3+15+
2+4+5+9+
2+4+6+8+
2+4+14+
2+5+6+7+
2+5+13+
2+6+12+
2+7+11+
2+8+10+
2+18+
3+4+5+8+
3+4+6+7+
3+4+13+
3+5+12+
3+6+11+
3+7+10+
3+8+9+
3+17+
4+5+11+
4+6+10+
4+7+9+
4+16+
5+6+9+
5+7+8+
5+15+
6+14+
7+13+
8+12+
9+11+

恩,我也运行了。是正确的,我现在看这代码还不行。得学习 :idea:

能把你的代码注释下吗??我是个小菜,看着有点困难啊 :oops:

恩,好的!!谢谢了!!