排列组合计算器,结果不对但找不出问题

2019-05-18 19:59:49 +08:00
 chenoe

源码如下:

<?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
2892 次点击
所在节点    PHP
4 条回复
oblivious
2019-05-18 20:25:58 +08:00
测试代码环境:
```
def foo:
return(True)
```
chenoe
2019-05-18 20:30:00 +08:00
@oblivious ? Python ?

另,回复不支持 Markdown,请使用 Default
oblivious
2019-05-18 20:31:32 +08:00
oblivious
2019-05-18 20:32:39 +08:00
@chenoe 我知道了,原来以后贴代码要去 gist 了。

回复也不支持 markdown,郁闷。

不会写 PHP,没法给你 debug,写了个 python 版本的,供你参考思路。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/565404

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX