数据结构与算法分析--学习笔记(3)

链表的可以应用于多项式的表示,我本想使用一个指针链表来实现大数的存储,但是发现进行乘法运算很麻烦。我想起以前的一个题,是求100!的值,于是我心血来潮写一个99!的阶乘出来算了,实际上,要写几百的阶乘也可以,但是毕竟只作为一个算法,就记载下来吧。

#include "stdio.h"
 
void Multi( int MultiNum, int * Num ){ //Num被乘数 ,MultiNum为乘数
     int i;
     int Degree = 1; //处理被乘数具体位数的旗标,由于被乘数顶多为两位数
     int k = 10; //
     int bitNum; //处理具体某位的数
     int UpNum = 0; //进位
     int Add[ 600 ] ; //加数
     int Added[ 600 ] ; //被加数
     for( i = 0; i < 600; i ++ ){ //初始化矩阵
          Add[ i ] = 0;
          Added[ i ] = 0;
     }
     if( Degree == 1 ){ //与个位相乘的和
         bitNum = MultiNum%k;
         for( i = 599; i >= 0; i -- ){
              Added[ i ] = Num[ i ] * bitNum + UpNum;
              UpNum = Added[ i ]/10;
              Added[ i ] = Added[ i ]%10;
         }
     }
     
     Degree --;
     UpNum = 0;
     
     if( Degree == 0 ){ //与十位相乘的和
         bitNum = MultiNum/k;
         for( i = 599; i > 0; i -- ){
              Add[ i-1 ] = Num[ i ] * bitNum + UpNum;
              UpNum = Add[ i-1 ]/10;
              Add[ i-1 ] = Add[ i-1 ]%10;
         }
     }
 

     for( i = 599; i >= 0; i -- ){ //加数与被加数相加
              Num[ i ] = Added[ i ] + Add[ i ] + UpNum;
              UpNum = Num[ i ]/10;
              Num[ i ] = Num[ i ]%10;
     }
}
  
main(){
       int Num[ 600 ] ;
       Num[ 599 ] = 1;
       int MultiNum;
       int i;
       int k = 0;
       for( i = 0; i < 599; i ++ )
       Num[ i ] = 0;
       for( MultiNum = 99; MultiNum > 0; MultiNum -- )
            Multi( MultiNum, Num );
       for( i = 0; i <600; i ++ )
       printf( "%d", Num[ i ] );
       getchar();
}


作者: controlqsw   发布时间: 2010-12-01