从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:
恩,好的!!谢谢了!!