回 帖 发 新 帖 刷新版面

主题:c++阶乘问题

题目:输入一个数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个回复)

沙发

且不说其他的算法问题,就看这个
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;
}

板凳

你的代码有几个问题
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 楼

谢谢,问题解决了一部分。但是问题是我想要是用递归方式,请指出所有错误好吗?

4 楼

[quote]你的代码有几个问题
1:0&nbsp;也有阶乘&nbsp;0!=1
&nbsp;&nbsp;&nbsp;所以if(n<=0)应改为if(n<0)
2:for(int&nbsp;i=1,s=0;i<=n;i++);
&nbsp;&nbsp;&nbsp;s应初始为1,还有后面的分号去掉
3:return&nbsp;(s+a(n-1));
&nbsp;&nbsp;&nbsp;直接return&nbsp;s;就可以了
4:cout<<"请输入正整数"<<endl;后应加cin>>n;
&nbsp;&nbsp;&nbsp;这样新输入的n就把前面的覆盖掉
&nbsp;&nbsp;&nbsp;再把else去掉
&nbsp;&nbsp;&nbsp;你去看看if语句的用法就明白了
&nbsp;&nbsp;&nbsp;试试按照上面说的去改看看

问题还是不行,输入数据后会直接打印“1”。而按原来的进行会在输入数据后直接踢回桌面。




[/quote]

5 楼

用了for循环就不能用递归
你可以这样
duuble a(a)
{
    if(a==0)
       return 1;
    else
       return n*a(a-i);
}

6 楼

你是用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 楼

明白了,不过楼上的这位大虾在
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 楼

谢谢指出

9 楼

#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 楼

可以看看这个网站( blog.csdn.net/liangbch), 内有大数阶乘的最详尽的算法讨论和代码。

我来回复

您尚未登录,请登录后再回复。点此登录或注册