V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chenoe
V2EX  ›  PHP

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

  •  1
     
  •   chenoe · 2019-05-18 19:59:49 +08:00 via Android · 2988 次点击
    这是一个创建于 2046 天前的主题,其中的信息可能已经有所发展或是发生改变。

    源码如下:

    <?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
    
    4 条回复    2019-05-18 20:32:39 +08:00
    oblivious
        1
    oblivious  
       2019-05-18 20:25:58 +08:00
    测试代码环境:
    ```
    def foo:
    return(True)
    ```
    chenoe
        2
    chenoe  
    OP
       2019-05-18 20:30:00 +08:00 via Android
    @oblivious ? Python ?

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

    回复也不支持 markdown,郁闷。

    不会写 PHP,没法给你 debug,写了个 python 版本的,供你参考思路。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4586 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 05:36 · PVG 13:36 · LAX 21:36 · JFK 00:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.