源码如下:
<?php
$n=2;
$c[1]=0;
$i[1]=2;
$i[2]=4;
$c[2]=0;
$i[3]=2;
$i[4]=4;
$result=1;
for ($xun1=0 ; $xun1<=$n ; $xun1++) {
$up[$xun1]=1;
$down[$xun1]=1;
};
for ($xun1=1 ; $xun1<=$n ; $xun1++) {
for ($xun2=1 ; $xun2<=$i[2*$xun1] ; $xun2++) {
$up[$xun1]=$up[$xun1]*$xun2;
};
for ($xun2=1 ; $xun2<=($i[2*$xun1]-$i[2*$xun1-1]) ; $xun2++) {
$down[$xun1]=$down[$xun1]*$xun2;
};
if ($c[$xun1]=1) {
for ($xun2=1 ; $xun2<=$i[2*$xun1-1] ; $xun2++) {
$down[$xun1]=$down[$xun1]*$xun2;
};
};
$result=$result*$up[$xun1]/$down[$xun1];
};
print $result;
?>
按照给定的值,输出是 36。但是排列 A ( 2,4 )的正确值是 12,两个相乘应该是 144。找了半天貌似找不出什么问题(汗)代码是从自己写的 VB 移植过来的,VB 运行一切正常,不知道是不是哪里错了?
简单注释下,$c 的值为 0 表示进行排列 A 运算,为 1 表示进行组合 C 运算。排列 A ( n,m )的计算方法为 n 的阶乘除以( n-m )的阶乘,组合 C 的计算方法就是在排列 A 的基础上再除以 m 的阶乘。( a 的阶乘就是从 a 乘到 1 )输入的$i,凡是数据号码为奇数的都是上标(即上述的 n ),偶数都是下标(即上述的 m )。输入的$n 表示排列 A 和组合 C 的总个数。如仍有疑问,请搜索排列组合公式+自行理解谢谢
另附上 VB 正确的源码供参考(这里多了个功能,如果 Selected 的值为 1 表示该组数据启用,如果为 0 则表示该组数据不参加运算):
Private Sub Command1_Click()
n=5: result = 1
ReDim up(n) As Single, down(n) As Single
For xun1 = 1 To n
up(xun1) = 1: down(xun1) = 1
Next xun1
For xun1 = 1 To n
If Selected(xun1).Value = 1 Then
For xun2 = 1 To Val(Text(2 * xun1).Text)
up(xun1) = up(xun1) * xun2
Next xun2
For xun2 = 1 To (Val(Text(2 * xun1).Text) - Val(Text(2 * xun1 - 1).Text))
down(xun1) = down(xun1) * xun2
Next xun2
If Check(xun1).Value = 1 Then
For xun2 = 1 To Val(Text(2 * xun1 - 1).Text)
down(xun1) = down(xun1) * xun2
Next xun2
End If
result = result * up(xun1) / down(xun1)
End If
Next xun1
Text1.Text = result
End Sub
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.