2006年12月23日土曜日

大数阶乘源码

别人要的时候写的,感觉速度还是蛮快的
#include
#include
#include
using namespace std;
typedef unsigned int Type;
enum{ BASE_DATA = 10000, MAX_NUM = 4000 , MAX_SIZE = MAX_NUM+1000};
struct MulOpt {
Type data1;
MulOpt(Type x):data1(x){}
inline Type operator()(Type y)
{
return data1*y;
}
};
struct ConverData
{
inline Type operator()(Type x)
{
int y = (x/1000);
x %= 1000;
y += ( x/ 100)<<8;
x %= 100;
y += ( x / 10)<<16;
y += (x % 10)<<24;
return y + 0x30303030 ;
}
};
struct NoEquZero
{
inline bool operator()( char x)
{
return ( 0 != x )?true:false;
}
};
int main(int argc, char* argv[])
{
vector Temp(MAX_SIZE);
Temp[0] = 1;
size_t nCurrendLen = 5;
for(int i = 2 ; i < MAX_NUM +1 ; ++ i){
transform( Temp.begin() ,Temp.begin() + nCurrendLen + 4 , Temp.begin() , MulOpt(i) );
nCurrendLen+= 1;
Type *p = &Temp[0];
for(size_t x = 0 ; x < nCurrendLen ; ++x ){
//处理进位
int temp = (*p)/BASE_DATA ;
(*p) %= BASE_DATA;
p++;
*p += temp;
}
}
reverse(Temp.begin() ,Temp.end() );//反转
Temp.erase( Temp.begin() , find_if( Temp.begin() ,Temp.end() , NoEquZero() ) );//移除结果开头的0
transform( Temp.begin() ,Temp.end() , Temp.begin() , ConverData() );//转化成字符串
Temp.push_back(0);
printf("%s\n",&Temp[0]);
return 0;
}

0 件のコメント: