VC++ 求一个数的阶乘遇到的错误?

来源:百度知道 编辑:UC知道 时间:2024/06/23 03:09:52
我用VC++ 求一个数的阶乘,编写的程序如下:
#include <iostream>
using namespace std;
long fac(int n)
{
long f;
if(n<0) cout<<"No answer!"<<endl;
else if(n==0) f=1;
else f=fac(n-1)*n;
return(f);
}
int main()
{
long fac(int n);
int n,x;
long y;
cout<<"Input the number n:";
cin>>x;
y=fac(x);
cout<<x<<"!="<<y<<endl;
}

书上的程序为:
#include <iostream>
using namespace std;
long fac(int n)
{
long f;
if(n<0) cout<<"No answer!"<<endl;
else if(n==0) f=1;
else f=fac(n-1)*n;
return(f);
}
int main()
{
long fac(int n);
int n;
long y;
cout<<"Input the number n:";
cin>>n;
y=fac(n);
cout<<n<<"!="<<y<<endl;
}

两段编译

1、屏幕上没有显示两种结果。第一个NO ANSWER是你的fac函数输出的。而后面那个是你的main里输出的。原因是你的main里面没有判断fac返回的是不是正确的答案。因为你的fac即使输出noanswer了,也会返回一个long的值。你可以通过no answer的时候返回-1,并且在main里面判断如果是-1就不输出解决
2、没有任何问题。

1.输入-3,程序运行到进入fac函数,虽然判断-3<0输出了no answer,但是fac函数仍然返回了一个long型的f,这个f并没有赋初值,所以系统自动赋给一个很大的负数(vc++是这样~~),返回给主函数中的y,在主函数再次把y输出了出来 (两次输出分别在fac函数中和main函数中,如果不输入负数,fac函数中就没有输出,只在主函数中有~~)
2.显然可以~~显然不会产生混淆~~

在你输出“no answer” 后,记得要从调用的函数返回,也就是-3的阶乘是不存在的,那么马上从fac函数返回,return 0;不要在往后执行了。

fac()有问题当执行到时,系统自动为其中长整型分配内存,该内存在被重新赋值前内容不可知,所以n<0时,返回的是不确定值,出错