数据结构与算法分析--学习笔记(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