$n=$_GET['n'];
$k=$_GET['k'];
if(!(($n<0 && $n>100) || $k<0))
{
for($i=1;$i<=$n;$i++)
{
$n1=1*$i;
}
for($j=1;$j<=$k;$j++)
{
$k1=1*$j;
}
for($x=1;$x<=($n-$k);$x++)
{
$x1=1*$x;
}
$out=$n1/$k1*$x1;
//echo $out;
}

解决方案 »

  1.   

    最开始我用的是递归,好像用了110字符。光function 这几个字就浪费了8个字符,加上(){},以及调用,浪费太多字符了。
    把函数调用去掉,程序全在一行里,变量名都是最短,文件最后的?>这两个字符也去掉了,但还是有90个字符。
    离70个字符还差远了
      

  2.   

    我把我的算法帖出来吧<?list($n,$k)=split(',',fgets(STDIN));for($p=$i=1;$i<=$k;)$p*=($n-$k+$i)/$i++;echo $p;[
      

  3.   

    上面最后多了个[,
    $p;就结尾了,没有 ?> ,这样省两个字符
    <?list($n,$k)=split(',',fgets(STDIN));for($p=$i=1;$i<=$k;)$p*=($n-$k+$i)/$i++;echo $p;
      

  4.   

    说一下我的思路:
    C(n,k)=n!/k!*(n-k)!  拆成两个数的积 一个是 n!/(n-k)!   一个是 1/k!
    n!/(n-k)!算出来就是  (n-k+1)* (n-k+2)* (n-k+3)* .. (n-k+k) 共k个数相乘
    1/k! 也是k个数相乘        1  *    2   *    3   * ..   k
    C(n,k)=  (n-k+1)/1 * (n-k+2)/2  * ..  (n-k+k)/k
    可以放到一个循环里
    for($result=$i=1;$i<=$k;$i++){
       $result=$result* ($n-$k+$i)/$i;
    }
    感觉自已代码已经很短了,但也要90个字符。
    最高纪录好像是60几个字符,不知他们的算法是什么
      

  5.   

    <?list($n,$k)=fscanf(STDIN,"%d,%d");$r=1;while($k)$r*=$n--/$k--;echo$r;
    好象是71个,如果不包括开头的<?的话,勉强合格...
      

  6.   

    又改了一下,这下就算加上后面的?>也只有70个了。
    其实关键是怎么读,不是怎么算,呵呵。
    <?fscanf(STDIN,"%d,%d",$n,$k);$r=1;while($k)$r*=$n--/$k--;echo$r;