首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

用递推法求100的阶乘,始终有一个疑问!该怎么处理

2012-02-23 
用递推法求100的阶乘,始终有一个疑问!我在网上搜索了一些这方面的例子,但我对语言不是很懂,所以不明了.现

用递推法求100的阶乘,始终有一个疑问!
我在网上搜索了一些这方面的例子,但我对语言不是很懂,所以不明了.现只想知道其原理.主要是不明白如何能取出数字参与运算..........
前提是只用整型数字!
虽然存储和打印都可用数组来完成,但参与中间过程运算始终要拿上一个数来乘以另一个数,这样一拿出来参与运算,不就超过整型数范围了,不明白,请问大家有何高招.

[解决办法]
以 http://blog.csdn.net/liangbch/archive/2007/04/19/1569963.aspx 的代码为例,给出说明.

void calcFac1(DWORD n)
{
DWORD i,carry,prod,len;
WORD *buff,*pHead,*pTail,*p;

if (n==0)
{ printf( "%d!=1 ",n); return; }

//---计算并分配所需的存储空间
len=calcResultLen(n,RAD);
buff=(WORD*)malloc( sizeof(WORD)*len);
if (buff==NULL)
return ;

//以下代码计算n!
pHead=pTail=buff+len-1;
for (*pTail=1,i=2;i <=n;i++)
{
for (carry=0,p=pTail;p> =pHead;p--)
{
prod=(DWORD)(*p) * i +carry;
*p=(WORD)(prod % RAD);
carry=prod / RAD;
}
while (carry> 0)
{
pHead--;
*pHead=(WORD)(carry % RAD);
carry /= RAD;
}
}
.................

看看这3句核心代码:
prod=(DWORD)(*p) * i +carry;
*p=(WORD)(prod % RAD);
carry=prod / RAD;

注意:prod,carry是unsigned long型,可表示2^32以内的数,*p 为unsigned short型,可表示一个65536以内的数.

先看这句: "prod=(DWORD)(*p) * i +carry; ",*p 是一个4位10进制数字,必不超过10000,当i小与40万时, *p * i +carry 必小于 2^32,因此可用prod 表示而不溢出.
再看 "*p=(WORD)(prod % RAD); " ,prod % 10000的结果小于65536,因此可用*p表示而溢出.

热点排行