注册 登录
编程论坛 C++教室

求1+2!+3!+...+20!的和

realll 发布于 2010-01-31 18:40, 7875 次点击
#include<iostream.h>
void main()
{
    int i=2;
    long int b,a;
    while(i<21)
    {
        b=i;
        a=1;
        while(b!=0)
        {
            b*=--b;

        }
            a+=b;
            i++;
        
    }
    cout<<a<<endl;
}
麻烦各位大虾了,这个帮忙修改下啊
22 回复
#2
mghxz2522010-02-02 13:10
不知道我的是不是对的?
#include<iostream.h>
void main()
{
  int i=2,m;
  double b,a=1;
  while(i<21)
    {
     m=i;
     b=1;
    while(m!=0)
      {
       b*=m;
       m--;
      }
      a+=b;
      i++;
     }   
cout<<a<<endl;
}

#3
cnfarer2010-02-02 13:25

#include <stdio.h>
#define N 20
int main(int argc, char *argv[])
{
    int i=1;float s=0,f=1;
    for (;i<=N ;i++ )
    {
        f=f*i;
        s=s+f;
    }
    printf("%20.0f",s);
    return 0;
}

没细想,现在改了,谢谢楼下提醒!

[ 本帖最后由 cnfarer 于 2010-2-2 14:08 编辑 ]
#4
mghxz2522010-02-02 13:51
楼上的程序确实比我想的简单多了,小弟佩服。

但是如果用 s=s+s*i 来求和的话,
会变成想下面的情况。
假设i=5,
s=(1!+2!+3!+4!)+(1!+2!+3!+4!)*5;
#5
zhoufeng19882010-02-02 16:59
程序代码:
#include <iostream>

using std::cout;
using std::endl;
using std::cin;

double Factorial(int);

int main()
{
    int num = 20;
    double result = 1;
    for (int i = 1; i <= num; i++)
    {
        result += Factorial(i);
    }
    cout << result<<endl;
    cin.get();
    return 0;
}

double Factorial(int number)
{
    double result = 1;  
    if (number > 0)
    {
        for (int i = 1; i <= number; i++)
        {
            result *= i;
        }
    }
    return result;
}
#6
gyx88992010-02-02 19:02
一己之见:(小做解释)
while(i<21)
    {
        b=i;
        a=1;
        while(b!=0)
        {
            b*=--b;

        }
            a+=b;
            i++;
        
    }
循环中:b既在累乘,又在b--(递减),出现错误。
需要通过中间变量,如二楼的回复。小弟敬佩。
long 的精度小于double
本题的答案超过long的范围,需换为double。
#7
realll2010-02-03 09:35
回复 2楼 mghxz252
O(∩_∩)O谢谢
#8
realll2010-02-03 09:35
回复 3楼 cnfarer
O(∩_∩)O谢谢
#9
realll2010-02-03 09:36
回复 5楼 zhoufeng1988
O(∩_∩)O谢谢
#10
realll2010-02-03 09:37
回复 6楼 gyx8899
O(∩_∩)O谢谢
#11
ly8610142010-02-03 22:19
回复 楼主 realll
从算法优劣上来讲,3楼的要比5楼的好啊,版主你说呢?
#12
promising2010-02-09 23:54
可以这样想吗?不是更简单吗?
#include <iostream.h>
void main()
{
    const n=20;
    int sum=0,i;
    for(i=n;i>=1;i--)
    {
        sum++;
        sum*=i;//其实可以这样求啊:((...(((0+1)*20+1)*19+1)*18+1...)*2+1)*1,呵呵
    }
    cout<<sum<<endl;
}
#13
realll2010-02-12 15:39
回复 12楼 promising
循环的每一次  sum都会++,那么值不是变了么
#14
promising2010-02-12 17:14
sum每+1,就多了一项
1# sum=20
2# sum=20*19+19
3# sum=20*19*18+19*18+18
.....
 
#15
realll2010-02-12 20:47
回复 14楼 promising
   
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
#16
realll2010-02-12 20:48
回复 14楼 promising
只有本站会员才能查看附件,请 登录
#17
promising2010-02-12 22:25
有什么不对吗?你认为哪里错了呢?
#18
realll2010-02-13 13:53
回复 17楼 promising
((...(((0+1)*20+1)*19+1)*18+1...)*2+1)*1

这里 21*19? 20!里不应该出现这个啊
#19
promising2010-02-13 15:28
干吗要加起来,直接拆开括号啊。
((0+1)*20+1)*19=20*19+19
(((0+1)*20+1)*19+1)*18=20*19*18+19*18+18

sum每+1,就多了一项
1# sum=20
2# sum=20*19+19
3# sum=20*19*18+19*18+18
.....
这样理解哇。。。
#20
七蚊2010-02-23 17:47
递归算法哪里去了?
#21
七蚊2010-02-23 18:22
#include <cstdlib>
#include <iostream>

using namespace std;
long plus(int n)
{long sum1=1;
 for(int i=1;i<(n+1);i++)
 {sum1*=i;}
  return sum1;  }
int main(int argc, char *argv[])
{long plus(int n);
 long sum=0;
 int x;
 cin>>x;
 for (int i=1;i<(x+1);i++)
 {
  sum+=plus(i);
              }
  cout<<sum;
    system("PAUSE");
    return EXIT_SUCCESS;
}
#22
tobypyle2010-03-02 17:32
20! 因该越界了........
#23
长安大学2010-03-03 18:03
20!计算机要算多长时间 啊?好象有个大数阶乘的问题
1