C++阶乘计算直到溢出
来源:百度知道 编辑:UC知道 时间:2024/06/15 13:04:37
阶乘计算
问题描述
在unsigned long型数据范围内计算自然数的阶乘直至溢出为止。
输入
无。
输出
1!,2!,3!,…的值,直到15!或溢出为止,每个阶乘算式占一行,见输出样例。注意等号前后有一个空格。
输出样例(部分)
1! = 1
2! = 2
3! = 6
4! = 14
5! = 120
……
问题描述
在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<&