先說最直觀的想法:
就先找出所有24/3 中 任8個相加=100的
再從剩下16 任8個 找出也有相加 =100的 就算一組
1+24總和 = (1+24)*24/2 = 300 拆三組 每組 300/3 = 100
所以當找到兩組8,8數字組合 相加為100 就是總和為200,剩下一組8個數字相加 300-200 必為100
所以當在16中找出一組,可以算成功找出一次。
而我的想法基本上就是從此
此方法,已固定兩邊的第一個位置,所以不用再除6
而我用的所有數字組別巡覽方法簡單暴力,因此會有重複情況發生
舉例最簡單的一組
e.g.
{[1, 2, 3, 4, 21, 22, 23, 24] ,[5,6,7,8,17,18,19,20],[9,10,11,12,13,14,15,16] }來看成ABC
但當
{ACB} {BAC}{BCA}{CAB}{CBA} 我都會看成不同組,但實際上 這幾種分法都是一樣的
3! = 6 所以我得到的數自還要再除6
但我巡覽過程中,數字不會重複,數字必為小到大排列,所以組內不會有數字重複情況發生。
import java.util.*;
public class DivideTwentyFourIntoThreeGroups {
static int count = 0;
static boolean repeat = false;
public static void main(String[] args) {
List<int[]> first100 = new ArrayList<int[]>();
List<Integer> restNumber = new ArrayList<Integer>();
for (int i1 = 1; i1 <= 9; i1++) // 9 10 11 12 13 14 15 16 後不會再有 10開頭的組別了,因為會加道破100
for (int i2 = i1 + 1; i2 <= 19; i2++) //倒數第二大
for (int i3 = i2 + 1; i3 <= 20; i3++) //倒數第三大
for (int i4 = i3 + 1; i4 <= 21; i4++) //倒數第四大
for (int i5 = i4 + 1; i5 <= 22; i5++) //倒數第三大
for (int i6 = i5 + 1; i6 <= 23; i6++) //倒數第二大
for (int i7 = i6 + 1; i7 <= 24; i7++) { //最大數 不會超過24 若無法理解上述也可以全改成<=24
int i8 = 100 - i1 - i2 - i3 - i4 - i5 - i6 - i7;
if (i8 > 24 || i8 <= i7)
continue;
if (i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 == 100)
first100.add(new int[] { i1, i2, i3, i4, i5, i6, i7, i8 });
// System.out.println(i1+" "+i2+" "+i3+" "+i4+" "+i5+" "+i6+" "+i7+" "+i8);
}
for (int j0 = 0; j0 < first100.size(); j0++) {
int[] first100array = first100.get(j0);
restNumber.clear();
for (int i = 1; i <= 24; i++) {
repeat = false;
for (int x : first100array) {
if (i == x) {
repeat = true;
break;
}
}
if (repeat == false)
restNumber.add(i); //把第一組100的組別扣除後,所剩16組數值
}
for (int j1 = 0; j1 < 9; j1++) // 16是
for (int j2 = j1 + 1; j2 < 10; j2++)
for (int j3 = j2 + 1; j3 < 11; j3++)
for (int j4 = j3 + 1; j4 < 12; j4++)
for (int j5 = j4 + 1; j5 < 13; j5++)
for (int j6 = j5 + 1; j6 < 14; j6++)
for (int j7 = j6 + 1; j7 < 15; j7++)
for (int j8 = j7 + 1; j8 < 16; j8++) { //同上概念 若無法理解已樣可以改成<16 不能等於16 因為是記憶體位置從0開始
if (restNumber.get(j1) + restNumber.get(j2) + restNumber.get(j3) + restNumber.get(j4) + restNumber.get(j5)
+ restNumber.get(j6) + restNumber.get(j7) + restNumber.get(j8) == 100) {
count++;
break;
}
}
}
System.out.println(count/6);
}
}
@copyright MRcodingRoom
觀看更多文章請點MRcoding筆記
觀看更多文章請點MRcoding筆記