C++ 阶乘不适用于所有值
大家好,我编辑了我的文章,因为我的代码还有一个问题。昨天我的阶乘函数有一个问题,但多亏了你们的回答,我终于解决了,这是一个可笑的错误。 现在的问题是,对于一些大于15的值,对于较小的值,最终结果(而不是单个数字的阶乘)总是0或-1。有人能告诉我这段代码有什么问题吗:C++ 阶乘不适用于所有值,c++,function,factorial,C++,Function,Factorial,大家好,我编辑了我的文章,因为我的代码还有一个问题。昨天我的阶乘函数有一个问题,但多亏了你们的回答,我终于解决了,这是一个可笑的错误。 现在的问题是,对于一些大于15的值,对于较小的值,最终结果(而不是单个数字的阶乘)总是0或-1。有人能告诉我这段代码有什么问题吗: #include <iostream> #include<time.h> using namespace std; int factorial(int a){
#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;
}
#包括
#包括
使用名称空间std;
整数阶乘(整数a){
如果(a==1)
返回1;
如果(a==0),则为else
返回1;
其他的
收益阶乘(a-1)*a;
}
int main(){
std::cout.setf(std::ios\u base::fixed,std::ios\u base::floatfield);
标准:计算精度(5);
int n,k;
整数x,y,z,w,v;
coutn;
库特克;
时钟;
t=时钟();
如果(n>=k&&k>1){
x=阶乘(n-1);
y=阶乘(k-1);
z=阶乘(n-1-k);
w=阶乘(n-k);
v=阶乘(k);
cout以下可能使用零或负参数调用factorial
:
z=factorial(n-1-k);
w=factorial(n-k);
您需要确保您的factorial
函数能够在不崩溃的情况下处理此类参数(我怀疑它不会崩溃)。以下函数可能使用零或负参数调用factorial
:
z=factorial(n-1-k);
w=factorial(n-k);
您需要确保您的阶乘
函数能够在不崩溃的情况下处理此类参数(我怀疑它不会崩溃)。整数溢出
如果系统上的int
是32位,则它可以表示的最大值是2147483647
。13阶乘是6227020800
如果使用64位整数类型,例如long
,则最多可以使用20个阶乘
浮点数会给你更多的范围,但会损失精度
如果你真的需要计算大的阶乘,你需要使用一些多精度库,比如,或者使用一种内置了任意精度整数运算的语言(C没有)。整数溢出
如果系统上的int
是32位,则它可以表示的最大值是2147483647
。13阶乘是6227020800
如果使用64位整数类型,例如long
,则最多可以使用20个阶乘
浮点数会给你更多的范围,但会损失精度
如果您真的需要计算大的阶乘,那么您需要使用一些多精度库,比如,或者使用一种内置了任意精度整数算法的语言(C没有).您需要向我们显示阶乘的代码。明白了!-确保在进行除法时,不会遇到被零除的错误,即v*z
和y*w
的值应该是非零。发布阶乘
函数可以让我们更深入地了解出了什么问题。嗯,您没有说它崩溃的地方。当它崩溃时,使用调试器查看发生了什么。您需要向我们显示factorial
的代码。明白了!-确保在进行除法时,不会遇到被零除的错误,即v*z
和y*w
的值应该是非零。发布factorial
函数tion会让我们更深入地了解出了什么问题。嗯,你没有说它在哪里崩溃。当它崩溃时,请使用调试器查看发生了什么。谢谢你,我刚刚意识到我忘记了计算阶乘函数中的零阶乘。我甚至不在乎看函数,因为我从一个旧的练习我一直在考虑,直到现在都是正确的。谢谢你,我刚刚意识到我忘记了计算阶乘函数中的零阶乘。我甚至不在乎看这个函数,因为我是从一个旧练习中复制粘贴的,我一直在考虑,直到现在都是正确的。谢谢你的答案,我会自己学习更多,看看我是否会改变一个我的代码上的任何东西。因为它在技术上是正确的,尽管我不认为我会因为不能计算所有值而受到惩罚。谢谢你的回答,我会自己多研究一点,看看我是否会修改代码。因为它在技术上是正确的,尽管我不认为我会因为不能计算所有值而受到惩罚