阶乘并不是对所有值都有效
Factorial does not work for all values
大家好,我编辑了我的帖子,因为我的代码有另一个问题。昨天我有一个关于阶乘函数的问题,但多亏了你们的答案,我设法解决了它,这是一个荒谬的错误。现在的问题是,对于一些大于15的值,最终结果(不是单个数字的阶乘)总是0或-1,对于较小的值,它工作得很好。有人能告诉我这段代码有什么问题吗?
#include <iostream>
#include<time.h>
using namespace std;
int factorial(int a){
if(a==1)
return 1;
else if(a==0)
return 1;
else
return factorial(a-1)*a;
}
int main(){
std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
std::cout.precision(5);
int n,k;
int x,y,z,w,v;
cout<<"give n : ";
cin>>n;
cout<<"give k : ";
cin>>k;
clock_t t;
t = clock();
if(n>=k&&k>1){
x=factorial(n-1);
y=factorial(k-1);
z=factorial(n-1-k);
w=factorial(n-k);
v=factorial(k);
cout<<"Result is "<<(x/(v*z))+(x/(y*w))<<endl;
}
else if (n==0||n==k)
cout<<"Result is 1"<<endl;
else
cout<<"Result is 0"<<endl;
t = clock() - t;
cout<<"It took "<<t<<" clicks ("<<((float)t)/CLOCKS_PER_SEC<<" seconds )"<<endl;
return 0;
}
整数溢出
如果int
在您的系统上是32位,那么它所能表示的最大值是2147483647
。13的阶乘是6227020800
如果使用64位整数类型(如long long
),则最多可以到20的阶乘。
浮点可以提供更大的范围,但会损失精度。
如果你真的需要计算大的阶乘,你需要使用一些多精度库,比如GMP,或者使用一种内置任意精度整数运算的语言(C没有)。
下面的代码可以使用0或负参数调用factorial
:
z=factorial(n-1-k);
w=factorial(n-k);
您需要确保您的factorial
函数可以处理这些参数而不会崩溃(我怀疑它不会)。
相关文章:
- 将此布尔值传递给此函数的最有效方法是什么?
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- boost beast Websocket Multi Request Server/Client 并不是真正的 mul
- 找到对称矩阵的最大元素的最有效算法是什么
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 释放 std::vector 中指针内存的最有效方法是什么?
- 虽然我添加了boost库,但Eclipse并不是用C++构建的.为什么
- 从长(且合理)稀疏向量中选择随机元素的最有效方法是什么?
- 填充红黑树的最有效方法是什么?
- 释放分配给大量矢量的内存的最有效方法是什么?
- 在使用 0MQ 异步接收时异步发送数据的最有效方法是什么?
- 在 c++ 中使用右值设置类变量的最有效方法是什么
- 将对象传递给函数并不是导致构造函数调用
- 检查字符串是否与可能的输入之一匹配的最有效方法是什么?
- 将随机数放入缓冲区以写入文件的有效方法是什么?
- 从向量中提取最小值、最大值和中位数的最有效方法是什么
- 阶乘并不是对所有值都有效