public class Math { int [] a = new int[3]; public void run(int i){ a[0] = i; for(int j=i+1;j<=sum(1)+1;j++){ a[1] = j; int temp = 23-sum(2); if(temp<=sum(2)+1){ a[2] = temp; doPrint(); }else continue; } } //求数组前n项加上1,2的和 public int sum(int num){ int sum = 1+2; for(int i=0;i<num;i++){ sum += a[i]; } return sum; } //打印 public void doPrint(){ System.out.print("1 "+"2 "); for(int i:a){ System.out.print(i+" "); } System.out.println(); } public static void main(String args[]){ Math math = new Math(); math.run(3); math.run(4); } } 结果同上
* @param args
*/
public static void main(String[] args) {
System.out.println("非递归算法的实现:");
for(int i1=1; i1<23; i1++) {
for(int i2=i1+1; i2<23; i2++) {
for(int i3=i2+1; i3<23; i3++) {
for(int i4=i3+1; i4<23; i4++) {
for(int i5=i4+1; i5<23; i5++) {
if(i1 + i2 + i3 + i4 + i5 == 23)
System.out.println(i1 +" "+ i2 +" "+i3+" "+i4+" "+i5);
}
}
}
}
}
System.out.println("递归算法的实现:");
int arr[] = new int[5]; //存储那5个数
getNum(arr, 0);
}
private static void getNum(int arr[], int pos) {
if(pos == arr.length) { //如果数组塞满了,则判断是否等于23
int result = 0;
for(int i=0; i<arr.length; i++)
result += arr[i];
if(result == 23) { //如果是23,则循环打印出来
for(int i=0; i<arr.length; i++)
System.out.print(arr[i] + " ");
System.out.println();
}
return;
}
for(int i=1; i<23; i++) {
if(pos > 0) //拿到的后一个数必须大于前一个数
if(i < arr[pos-1]) continue;
if(isContain(i, arr)) continue;
arr[pos] = i;
getNum(arr, pos+1);
}
}
/**
* 判断数组中arr是否包含了指定的数x
* @param x
* @param arr
* @return
*/
private static boolean isContain(int x, int arr[]) {
for(int i=0; i<arr.length; i++) {
if(x == arr[i])
return true;
}
return false;
}
}
public class Test3 { /**
* 因为最开始的3个数1,2,3是必须要有的,所以只需判断最后的2个数能否合符条件即可
* @param args
*/
public static void main(String[] args) {
int arr[] = new int[5]; //存储5个数,前3个数分别是1,2,3
arr[0] = 1; arr[1] = 2; arr[2] = 3;
for(int i=4; i<=8; i++) { //i代表的是第4个数,它的取值只能是4到8之间
boolean f = true; //记录当前的组合是否符合条件
arr[3] = i;
arr[4] = 23-6-i;
for(int j=2; j<4; j++) { //j值代表了当前取到的哪个数了
//只需判断前j个数的和与j后面那个数的差不能超过1就可以判断是否合符条件(至于为什么?仔细思考下就知道了)
if(getSum(arr, j)-arr[j+1] < -1) {
f = false; //不合符就设为false
break;
}
}
if(f) { //如果符合就打印输出
for(int k=0; k<arr.length; k++)
System.out.print(arr[k] + " ");
System.out.println();
}
}
}
private static int getSum(int arr[], int j) {
int sum = 0;
for(int i=0; i<=j; i++) {
sum += arr[i];
}
return sum;
}
}
public class Test3 { /**
* 因为最开始的2个数1,2是必须要有的,并且第3个数只能取3,4中间的值。
* @param args
*/
public static void main(String[] args) {
int arr[] = new int[5]; //存储5个数,前2个数分别是1,2
arr[0] = 1; arr[1] = 2;
for(int k=3; k<=4; k++) { //k代表了第3个数,只能取3,4中间的数
arr[2] = k;
for(int i=4; i<=8; i++) { //i代表的是第4个数,它的取值只能是4到8之间
if(i == k) continue;
boolean f = true; //记录当前的组合是否符合条件
arr[3] = i;
arr[4] = 23-3-k-i; //根据之前给定的4个数算出第5个数来
if(arr[4] == arr[3]) continue;
for(int j=2; j<4; j++) { //j值代表了当前取到的哪个数了
//只需判断前j个数的和与j后面那个数的差不能超过1就可以判断是否合符条件(至于为什么?仔细思考下就知道了)
if(getSum(arr, j)-arr[j+1] < -1) {
f = false; //不合符就设为false
break;
}
}
if(f) { //如果符合就打印输出
for(int m=0; m<arr.length; m++)
System.out.print(arr[m] + " ");
System.out.println();
}
}
}
}
private static int getSum(int arr[], int j) {
int sum = 0;
for(int i=0; i<=j; i++) {
sum += arr[i];
}
return sum;
}
}最后打印出来的结果是:
1 2 3 5 12
1 2 3 6 11
1 2 3 7 10
1 2 4 5 11
1 2 4 6 10
1 2 4 7 9
int [] a = new int[3];
public void run(int i){
a[0] = i;
for(int j=i+1;j<=sum(1)+1;j++){
a[1] = j;
int temp = 23-sum(2);
if(temp<=sum(2)+1){
a[2] = temp;
doPrint();
}else
continue;
}
}
//求数组前n项加上1,2的和
public int sum(int num){
int sum = 1+2;
for(int i=0;i<num;i++){
sum += a[i];
}
return sum;
}
//打印
public void doPrint(){
System.out.print("1 "+"2 ");
for(int i:a){
System.out.print(i+" ");
}
System.out.println();
}
public static void main(String args[]){
Math math = new Math();
math.run(3);
math.run(4);
}
}
结果同上