陕西省主要领导:如何用编程将1个数分解为不重复6个数(1到30之间)之和,该理论是能够有结果的。
终于弄出来了:用VB写的,估计你看得懂,都是basic
Private Sub Command1_Click()
Dim xt As Long
Dim xtt As Long
Dim xts As Long
xtt = Val(Text1.Text)
xts = xtt - 21
List1.Clear
xt = 0
For i6 = xts \ 6 To Min(24, xts)
For i5 = 0 To Min(25, xts - i6)
If i5 < i6 + 1 Then
For i4 = 0 To Min(26, xts - i6 - i5)
If i4 < i5 + 1 Then
For i3 = 0 To Min(27, xts - i6 - i5 - i4)
If i3 < i4 + 1 Then
For i2 = 0 To Min(28, xts - i6 - i5 - i4 - i3)
If i2 < i3 + 1 Then
For i1 = 0 To Min(29, xts - i6 - i5 - i4 - i3 - i2)
If i1 < i2 + 1 And (i1 + i2 + i3 + i4 + i5 + i6) = xts Then
List1.AddItem CStr(i1 + 1) + "+" + CStr(i2 + 2) + "+" + CStr(i3 + 3) + "+" + CStr(i4 + 4) + "+" + CStr(i5 + 5) + "+" + CStr(i6 + 6) + "=" + CStr(i1 + i2 + i3 + i4 + i5 + i6 + 21)
xt = xt + 1
End If
Next i1
End If
Next i2
End If
Next i3
End If
Next i4
End If
Next i5
Next i6
List1.AddItem xt
End Sub
Private Function Min(x, y)
If x > y Then
Min = y
Else
Min = x
End If
End Function
下面分解30:
2+3+4+6+7+8=30
1+3+5+6+7+8=30
2+3+4+5+7+9=30
1+3+4+6+7+9=30
1+2+5+6+7+9=30
1+3+4+5+8+9=30
1+2+4+6+8+9=30
1+2+3+7+8+9=30
2+3+4+5+6+10=30
1+3+4+5+7+10=30
1+2+4+6+7+10=30
1+2+4+5+8+10=30
1+2+3+6+8+10=30
1+2+3+5+9+10=30
1+3+4+5+6+11=30
1+2+4+5+7+11=30
1+2+3+6+7+11=30
1+2+3+5+8+11=30
1+2+3+4+9+11=30
1+2+4+5+6+12=30
1+2+3+5+7+12=30
1+2+3+4+8+12=30
1+2+3+5+6+13=30
1+2+3+4+7+13=30
1+2+3+4+6+14=30
1+2+3+4+5+15=30
共26
//这是一个C(30,6)的问题,关键是举出6个数的全部组合
//前一位遍历时,下一位只能从前一位以后开始遍历,就是关键
//用递归实现,参数定义:
//B[0]临时,B[1]~B[6]:六位数,这个数组传地址
//nDeep:迭代深度, nStart:当前位循环起始值,这两个参数传值
//nCount,总个数。传地址
#include <stdio.h>
void fun(int B[7], int nDeep, int nStart, int* nCount, int nDestNum){
for(B[nDeep]=nStart; B[nDeep]<=30; B[nDeep]++){//穷举所有组合数
if(nDeep<6)
fun(B, nDeep+1, B[nDeep]+1, nCount, nDestNum);
else { //检查组合
B[0]=B[1]+B[2]+B[3]+B[4]+B[5]+B[6];
if(B[0]==nDestNum){
printf("%d+%d+%d+%d+%d+%d=%d\n",B[1],B[2],B[3],B[4],B[5],B[6],nDestNum);
(*nCount)++;
}
}
}
}
void main(int argc, char *argv[])
{
int B[7], nCount=0;
fun(B, 1, 1, &nCount, 31);
printf("共计%d个\n",nCount);
}
---------计算31的分解-----------
1+2+3+4+5+16=31
1+2+3+4+6+15=31
1+2+3+4+7+14=31
1+2+3+4+8+13=31
1+2+3+4+9+12=31
1+2+3+4+10+11=31
1+2+3+5+6+14=31
1+2+3+5+7+13=31
1+2+3+5+8+12=31
1+2+3+5+9+11=31
1+2+3+6+7+12=31
1+2+3+6+8+11=31
1+2+3+6+9+10=31
1+2+3+7+8+10=31
1+2+4+5+6+13=31
1+2+4+5+7+12=31
1+2+4+5+8+11=31
1+2+4+5+9+10=31
1+2+4+6+7+11=31
1+2+4+6+8+10=31
1+2+4+7+8+9=31
1+2+5+6+7+10=31
1+2+5+6+8+9=31
1+3+4+5+6+12=31
1+3+4+5+7+11=31
1+3+4+5+8+10=31
1+3+4+6+7+10=31
1+3+4+6+8+9=31
1+3+5+6+7+9=31
1+4+5+6+7+8=31
2+3+4+5+6+11=31
2+3+4+5+7+10=31
2+3+4+5+8+9=31
2+3+4+6+7+9=31
2+3+5+6+7+8=31
共计35个