主题:c++阶乘问题
黑色狙击手
[专家分:0] 发布于 2006-08-26 17:50:00
题目:输入一个数n,求1!+2!+3!..........+n!
我的解答:
#include<iostream.h>
double a(n)
{
for(int i=1,s=0;i<=n;i++);
s*=i;
return (s+a(n-1));
}
void main()
{
int n=0;
cout<<"请输入数据"<<endl;
cin>>n;
if(n<=0)
cout<<"请输入正整数"<<endl;
else
cout<<a(n)<<endl;
}
问题:为什么运行时会被踢回桌面?
回复列表 (共10个回复)
沙发
whtuling [专家分:1230] 发布于 2006-08-26 21:40:00
且不说其他的算法问题,就看这个
if(n<=0)
cout<<"请输入正整数"<<endl;
else
cout<<a(n)<<endl
这样有意义吗?判断了后就打印让输入正整数,那输入的语句跑哪去了呢?建议多看看书吧。
----------------------------------------------
下面我以前用C写的:
#include<stdio.h>
long factorial_sum(int n)
{
int i;
long s,t;
if(n<0){printf("Error enter!");return;}
if(n==0)return(1);
for(i=1,t=1,s=0;i<=n;i++)
{
t=t*i;
s=s+t;
}
return(s);
}
int main()
{
int n;
printf("Enter n:");
scanf("%d",&n);
printf("Result:=%ld",factorial_sum(n));
system("pause");
return 0;
}
板凳
dugulang [专家分:240] 发布于 2006-08-26 22:00:00
你的代码有几个问题
1:0 也有阶乘 0!=1
所以if(n<=0)应改为if(n<0)
2:for(int i=1,s=0;i<=n;i++);
s应初始为1,还有后面的分号去掉
3:return (s+a(n-1));
直接return s;就可以了
4:cout<<"请输入正整数"<<endl;后应加cin>>n;
这样新输入的n就把前面的覆盖掉
再把else去掉
你去看看if语句的用法就明白了
试试按照上面说的去改看看
3 楼
黑色狙击手 [专家分:0] 发布于 2006-08-26 22:03:00
谢谢,问题解决了一部分。但是问题是我想要是用递归方式,请指出所有错误好吗?
4 楼
黑色狙击手 [专家分:0] 发布于 2006-08-26 22:11:00
[quote]你的代码有几个问题
1:0 也有阶乘 0!=1
所以if(n<=0)应改为if(n<0)
2:for(int i=1,s=0;i<=n;i++);
s应初始为1,还有后面的分号去掉
3:return (s+a(n-1));
直接return s;就可以了
4:cout<<"请输入正整数"<<endl;后应加cin>>n;
这样新输入的n就把前面的覆盖掉
再把else去掉
你去看看if语句的用法就明白了
试试按照上面说的去改看看
问题还是不行,输入数据后会直接打印“1”。而按原来的进行会在输入数据后直接踢回桌面。
[/quote]
5 楼
dugulang [专家分:240] 发布于 2006-08-27 10:37:00
用了for循环就不能用递归
你可以这样
duuble a(a)
{
if(a==0)
return 1;
else
return n*a(a-i);
}
6 楼
dugulang [专家分:240] 发布于 2006-08-27 10:44:00
你是用VC++6.0编译的吗??
这是我改的你看看
#include<iostream.h>
double a(int n)
{
for(int i=1,s=1;i<=n;i++)
s*=i;
return s;
}
void main()
{
int n=0;
cout<<"请输入数据"<<endl;
cin>>n;
if(n<0)
{
cout<<"请输入正整数"<<endl;
cin>>n;
}
cout<<a(n)<<endl;
}
7 楼
黑色狙击手 [专家分:0] 发布于 2006-08-27 21:51:00
明白了,不过楼上的这位大虾在
double a(int n)
{
for(int i=1,s=1;i<=n;i++)
s*=i;
return s;
}
错了一小步,应该是
double a(n)
{
for(int i=1,s=1,c=0;i<=n;i++)
{
s*=i;
c+=s;
}
不过还是谢谢哈。
8 楼
dugulang [专家分:240] 发布于 2006-08-28 10:38:00
谢谢指出
9 楼
superlcr [专家分:2300] 发布于 2006-08-28 13:12:00
#include <iostream>
using namespace std;
double work(int);
double jiecheng(int);
int main()
{
int i;
cin >> i;
cout << work(i) << endl;
return 0;
}
double work(int i)
{
if(i == 1)
return 1;
return jiecheng(i) + work(i - 1);
}
double jiecheng(int i)
{
if(i == 1)
return 1;
return i * jiecheng(i - 1);
}
10 楼
liangbch [专家分:1270] 发布于 2007-04-28 17:23:00
可以看看这个网站( blog.csdn.net/liangbch), 内有大数阶乘的最详尽的算法讨论和代码。
我来回复