C++阶乘计算直到溢出

来源:百度知道 编辑:UC知道 时间:2024/06/15 13:04:37
阶乘计算
问题描述

在unsigned long型数据范围内计算自然数的阶乘直至溢出为止。

输入

无。

输出

1!,2!,3!,…的值,直到15!或溢出为止,每个阶乘算式占一行,见输出样例。注意等号前后有一个空格。

输出样例(部分)

1! = 1

2! = 2

3! = 6

4! = 14

5! = 120

……

楼上的方法是没有问题的,但是我觉的,上面的方法利用了算法的优势,那就是阶乘是个增函数,我们知道后一个阶乘数总是比前一个大,如果我们的算法不是增函数了怎么办?这个方法当然可以治标,但是如果想治本请看下面的解法:
在x86结构的CPU中有个Flags寄存器,这个寄存器中包含了上次计算的一些详细信息,比如是否溢出,下面的方法就可以检测到这个寄存器中的内容,然后判断是否溢出。

#include<iostream>

int main(int argc, _TCHAR* argv[])
{
int ret = 1;
long eflags = 3;

for (int i=1;i<1000000;i++)
{
ret *= i;
__asm{
PUSH EAX
PUSHFD
POP EAX
MOV eflags,EAX
POP EAX
}
if( eflags&0x00000800 )
{
break;
}
std::cout<<"!"<<i<<"="<<ret<<std::endl;
}
return 0;
}

#include<iostream>

using namespace std;

int main()
{
int i,j;
unsigned long num=1;

for(i=1;i<=15;i++)
{
num=1;
for(j=1;j<=i;j++) num*=j;
cout<<i<<"! = "<<num<&