计算大整数(比如1000)的阶乘

#include <iostream>
using namespace std;

int multi(char a, char b)
{
	return (a - '0') * (b - '0');
}

void strMulti(char *a, char *b, char *c)
{
	// 最好对a,b和c的合法性进行判断

	int lenA = strlen(a);
	int lenB = strlen(b);
	int maxLen = lenA + lenB;
	int *p = new int[maxLen];
	memset(p, 0, maxLen * sizeof(int)); // 千万要注意不要写成memset(p, 0, maxLen);

	int i, j;
	for(j = lenB - 1; j >= 0; j--)
	{
		for(i = lenA - 1; i >= 0; i--)
		{
			p[j + i + 1] += multi(b[j], a[i]);
		}
	}

	// 处理进位操作
	for(i = maxLen - 1; i >= 1; i--)
	{
		p[i - 1] += p[i] / 10;
		p[i] = p[i] % 10;
	}

	int *s = p;

	// m位正整数和n位正整数相乘,结果的位数必然是(m+n-1)位或者(m+n)位
	if(0 == p[0])
	{
		p++;
	}
	
	int *pTmp = NULL;
	for(pTmp = p; pTmp < s + maxLen; pTmp++)
	{
		*c++ = *pTmp + '0';
	}

	*c = '\0';

	delete s;
}

void factorial(int n, char *str)
{
	int i;
	*str = '1';
	*(str + 1) = '\0';
	char b[5000];
	for(i = 1; i <= n; i++)
	{
		itoa(i, b, 10);
		strMulti(str, b, str);
	}
}

int main()
{
	char str[5000];
	int i;

	for(i = 1000; i <= 1000; i++)
	{
		factorial(i, str); // i不要过于大了,否则有可能出问题
		cout << i << ":" << endl; // 跟Windows自带计算器的结果相等
		cout << str << endl << endl;
	}
	
	return 0;
}


结果为(与Windows计算器算出的结果一致):

1000:
40238726007709377354370243392300398571937486421071463254379991042993851239862902
05920442084869694048004799886101971960586316668729948085589013238296699445909974
24504087073759918823627727188732519779505950995276120874975462497043601418278094
64649629105639388743788648733711918104582578364784997701247663288983595573543251
31853239584630755574091142624174743493475534286465766116677973966688202912073791
43853719588249808126867838374559731746136085379534524221586593201928090878297308
43139284440328123155861103697680135730421616874760967587134831202547858932076716
91324484262361314125087802080002616831510273418279777047846358681701643650241536
91398281264810213092761244896359928705114964975419909342221566832572080821333186
11681155361583654698404670897560290095053761647584772842188967964624494516076535
34081989013854424879849599533191017233555566021394503997362807501378376153071277
61926849034352625200015888535147331611702103968175921510907788019393178114194545
25722386554146106289218796022383897147608850627686296714667469756291123408243920
81601537808898939645182632436716167621791689097799119037540312746222899880051954
44414282012187361745992642956581746628302955570299024324153181617210465832036786
90611726015878352075151628422554026517048330422614397428693306169089796848259012
54583271682264580665267699586526822728070757813918581788896522081643483448259932
66043367660176999612831860788386150279465955131156552036093988180612138558600301
43569452722420634463179746059468257310379008402443243846565724501440282188525247
09351906209290231364932734975655139587205596542287497740114133469627154228458623
77387538230483865688976461927383814900140767310446640259899490222221765904339901
88601856652648506179970235619389701786004081188972991831102117122984590164192106
88843871218556461249607987229085192968193723886426148396573822911231250241866493
53143970137428531926649875337218940694281434118520158014123344828015051399694290
15348307764456909907315243327828826986460278986432113908350621709500259738986355
42771967428222487575867657523442202075736305694988250879689281627538488633969099
59826280956121450994871701244516461260379029309120889086942028510640182154399457
15680594187274899809425474217358240106367740459574178516082923013535808184009699
63725242305608559037006242712434169090041536901059339838357779394109700277534720
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值