源码如下:
<?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
1
oblivious 2019-05-18 20:25:58 +08:00
测试代码环境:
``` def foo: return(True) ``` |
2
chenoe OP |
3
oblivious 2019-05-18 20:31:32 +08:00
<script src="https://gist.github.com/songsuoyuan/e09215e39a0424265b1cb6fe0da3783b.js"></script>
|