23 12
发新话题
打印

独善其身的新成长日志

08年3月22日
一天没有来写日志了。
今天上午准备做C语言的行列式计算。 但是后面发现因为现在学校才教一点点,而自己也在忙其它方面的事。今天上午我终于发现C语言的数组和指针跟高级语言确实不一样。所以我决定暂时放下这个。
今天下午花了一下午把行列式的计算用PHP写了出来。当然还可以改得更方便,不过我也要忙自己的事情了。从晚上开始,可以做其它的事了。就这样。
对了。还多说一句,昨天高数补考完了。我终于可以狂看离散了,大学生活从现在才开始。

TOP

代码我忘了给出来。这个是计算3111
                                                 1311
                                                 1131
                                                 1113这个行列式的代码,计算其它行列式按例替换掉就OK了。
复制内容到剪贴板
代码:

<?php
function swap(&$a,&$b)/*转换数组的下标和数组值的对应关系,以实现排列。*/
{
$temp=$a;
$a=$b;
$b=$temp;
}
function arrange($my_array,$k,$m)/*值数组下标的最后一个值。每层级可以看作,用$k开头,以$m结尾的的新数列,然后排列。*/
{
if($k==$m)/*当$k=$m-1的时候经过一次swap就跳入此分支,把已经排列好的一组排列输出,然后经过跳出swap程序跳出*/
{  
  for($i=0;$i<=$m;$i++)
  {
   $temp=$my_array[$i];
   $a_arr[$i] = $temp;
  }
  $GLOBALS['my_value'] += a_value($a_arr,$m);
}
else
{
  for($i2=$k;$i2<=$m;$i2++)
  {
   swap($my_array[$k],$my_array[$i2]);/*把此步骤看成一次从长排列到短排列的楼梯,从一级跳入内部一级时必然经过此次转换。然后生成一个新的排列,也就是除当前层确定的数后面的数组成的排列*/
   arrange($my_array,$k+1,$m);/*每一次最外级别的$i值都会经过这里跳入最里层。以$k值的变化控制数组下标的转换。(就不能转变当前这一层所确定最靠前的数)
   只能通过后续的for循环改变后面指针的变化.*/
   swap($my_array[$k],$my_array[$i2]);/*把此步骤看成一次从长排列到短排列的楼梯,从一级跳入外部部一级时必然经过此次转换。然后生成一个新的排列,也就是除当前层确定的数后面的数组成的排列*/
  }
}
}
function a_value($a_arr,$m)
{
$counter=0;
for($i=1;$i<=$m;$i++)
{
  for($j=0;$j<$i;$j++)
  {
   if ($a_arr[$j]>$a_arr[$i])
   {
    $counter+=1;
   }
  }
}
$counter%2==0?$flag=1flag=-1;
$a_value=1;
$j=0;
for ($i=0;$i<=$m;$i++)
{
  $a_value*=$GLOBALS['u_arrange'][$j][$a_arr[$i]];
  $j++;
}
$a_value*=$flag;
return $a_value;
}
$u_arrange[0]=array(3,1,1,1);
$u_arrange[1]=array(1,3,1,1);
$u_arrange[2]=array(1,1,3,1);
$u_arrange[3]=array(1,1,1,3);
global $u_arrange;
global $my_value;
$my_value=0;
$m=count($u_arrange[0])-1;
for($i=0;$i<=$m;$i++)
{
$my_array[$i]=$i;
}
arrange($my_array,0,$m);
echo "\n",$GLOBALS['my_value'];
?>
[ 本帖最后由 sese53 于 2008-3-22 17:13 编辑 ]

TOP

08年3月23日
本来昨天上午我已经准备放弃C的编写了。因为涉及到一个问题始终没有解决。而对于C语言的行列式我也始终没有找到一种好的编译环境。始终不能调试。但是下午我回寝室的时候,我的一个寝室同学给了我一个惊喜。他把那个问题解决了。于是乎,我们也共同解决了一些其它存在的小问题。比如把那个多重FOR循环换成昨天我贴出来的递归。另外把原来写的-1的N次方的函数直接改成n%2==0?1:-1。今天我再对格式和一些变量名的改动。终于把C语言的行列式计算做出来了。理论上100行100列的行列式都能计算。
对了,和我以前写的PHP对比了一下效率。c的效率是C++的N倍,而C++又是其它高级语言的N倍,这句话确实不假。PHP就算生成9个数的全排列大概都要9秒左右。而C语言你几乎感觉不到。

[ 本帖最后由 sese53 于 2008-3-23 16:00 编辑 ]
附件: 您所在的用户组无法下载或查看附件

TOP

 23 12
发新话题