哪位高手用c#语言 编写 求出1!+2!+3!+4!+…n! 的和?

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.Text;
    namespace jiechengDemo{    
    class Program    
    {        
    public static long jiecheng(int n)        
    {            
    if (n == 0)                
    return 1;            
    else                
    return n * jiecheng(n - 1);        
    }        
    static void Main(string[] args)        
    {            
    Console.Write("enter n:");            
    int n= int.Parse (Console.ReadLine());            
    long sum = 0;            
    for (int i = 1; i <= n; i++)            
    {                
    sum += jiecheng(i);            
    }            
    Console.WriteLine(sum.ToString());            
    Console.Read();        
    }    
    }
    }
      

  2.   

    如果n是10000,或者更大时,二楼的这个long就不行了
      

  3.   

    首先要考虑的就是用什么来存储这个结果...如果n很大的话,long型是肯定不够的.
      

  4.   

    其实这道题目的要点在于它的算法,一般人非常容易想到,算出每个数的阶乘,然后一个一个得相加,关键在于算阶乘的时候,如果图方便就每个数都从1计算它的阶乘,实际上这是没有必要的,因为这里有重复的过程,所以合理的算法应该是去掉这些重复的部分,具体算法如下:
    using System;
    class cal
    {
    static void Main()
    {
    Console.Write("enter n:");            
    int n= int.Parse (Console.ReadLine());    
    double multi=1;
    double sum=0;
    for(int i=1;i<=n;i++)
    {
    multi=multi*i;
    sum=sum+multi;
    }
    Console.WriteLine("阶乘总和为:{0}",sum);
    }
    }
      

  5.   

    n!阶乘不是(n-1)!*n吗?(n-1)!计算出来了,难道还要从1开始计算n的阶乘吗?重复的太多了。
    这个问题要考虑的第一个就是去除重复的计算增加效率,然后要考虑的就是所使用的数据类型的存储范围。
      

  6.   

    double multi=1;
    double sum=0;
    for(int i=1;i<=n;i++)
    {
    multi=multi*i;
    sum=sum+multi;
    }
    正解,英雄所见很同
      

  7.   

    for(int i=1;i<=n;i++)
    {
    multi=multi*i;
    sum=sum+multi;
    }
    学习一下
      

  8.   

    晕,大家都想这么复杂,这个式子只要求[n*n - (1+2+3+....+n)]*(n+1)就得了
      

  9.   

    没严格测试,算错了概不负责!class Program
    {
        const int Max = 1000;
        static int fac1Wei=1,fac2Wei=1,sum1Wei=1,sum2Wei=1; // xWei表示对应数组最高有效位,数组每节存储4位的数字
        static int[] fac_odd=new int[1000];                          // 分别存储了当N为奇/偶数时的N!和1!+2!+...+N!
        static int[] fac_even=new int[1000];
        static int[] sum_odd=new int[1000];
        static int[] sum_even=new int[1000];    static void fac_Sum(int N)
        {
            int i,Jin,tmp;
            if(N>1)
            {
            fac_Sum(N-1);
            if(N % 2 == 0)
            {
            fac2Wei=0;
                    sum2Wei=0;
            Jin=0;
            for(i=0;i<fac1Wei;i++)
            {
                        tmp=Jin+fac_odd[i]*N;
                        fac_even[i]=tmp%10000;
            Jin=tmp/10000;
            fac2Wei++;
            }
            if(Jin>0)
            {
            fac2Wei++;
            fac_even[fac2Wei-1]=Jin;
            }
            Jin=0;
            for(i=0; i<( (sum1Wei>fac2Wei)?sum1Wei:fac2Wei ); i++)
            {
            tmp=Jin+sum_odd[i]+fac_even[i];
                        sum_even[i]=tmp%10000;
            Jin=tmp/10000;
            sum2Wei++;
            }
            if(Jin>0)
            {
            sum2Wei++;
            sum_even[sum2Wei-1]=Jin;
            }
            }
            else
            {
                    fac1Wei = 0;
                    sum1Wei = 0;
            Jin=0;
            for(i=0;i<fac2Wei;i++)
            {
                        tmp=Jin+fac_even[i]*N;
                        fac_odd[i]=tmp%10000;
            Jin=tmp/10000;
            fac1Wei++;
            }
            if(Jin>0)
            {
            fac1Wei++;
            fac_odd[fac1Wei-1]=Jin;
            }
            Jin=0;
            for(i=0; i<( (sum2Wei>fac1Wei)?sum2Wei:fac1Wei ); i++)
            {
            tmp=Jin+sum_even[i]+fac_odd[i];
                        sum_odd[i]=tmp%10000;
            Jin=tmp/10000;
            sum1Wei++;
            }
            if(Jin>0)
            {
            sum1Wei++;
            sum_odd[sum1Wei-1]=Jin;
            }
            }
            }
        }
        static void facSum(int N)
        {
            int i;
            if(N>=1)
            {
                fac_Sum(N);                            // 算法原理是a[n]=n*a[n-1],s[n]=a[n]+s[n-1]
                Console.WriteLine("当n={0}时:", N);
            Console.Write("1!+2!+3!+......+n!=");
            if(N % 2 == 0)                         // 因为是奇偶交叉运算,所以最后结果可能存储在sum_even或sum_odd中
            {
                    Console.Write("{0}", sum_even[sum2Wei - 1]);
            for(i=sum2Wei-2;i>=0;i--)
            {
                        Console.Write("{0:d4}", sum_even[i]);
            }
            }
            else
            {
                    Console.Write("{0}", sum_odd[sum1Wei - 1]);
            for(i=sum1Wei-2;i>=0;i--)
            {
                        Console.Write("{0:d4}", sum_odd[i]);
            }
            }
                Console.WriteLine();
            }
            else
            {
            }
        }      
        static void Main(string[] args)
        {
            int M;
            fac_odd[0]=1;
            fac_even[0]=1;
            sum_odd[0]=1;
            sum_even[0]=1;
            Console.WriteLine("请输入你要求的阶乘数(<=1000):");
            M = int.Parse(Console.ReadLine());
            if (M > 1)
            {
                if (M <= Max)
                {
                    facSum(M);             //求阶乘之和
                }
                else
                {
                    Console.WriteLine("输入的数字太大,拒绝计算:");
                }
            }
            else
            {
                Console.WriteLine("…… + "+M.ToString()+"! = 1");
            }
            Console.Read();
        }        
    }    
      

  10.   

    大家看我这样写对不?
    int sum 
    for(int i=1;i<=n;i++)
     sum+=jc(i)jc(int j)
    {
     if(j==1)
       return  1
     else
       return jc(j-1)*j
    }}
      

  11.   

    实现方法很多,2楼的mytigo写的很好,建议楼主采用
      

  12.   

            public int calc(int n)
            {
                if (n == 1)
                    return 1;
                return n + calc(--n);
            }
      

  13.   

    然后调用的时候
                int n = 100;
                Console.WriteLine(calc(calc(n)).ToString());
      

  14.   

    上面错了,真丢脸,为何不能编辑啊
            public int calc(int n)
            {
                if (n == 1)
                    return 1;
                return n + calc(--n);
            }        public int calc1(int n)
            {
                if (n == 1)
                    return 1;
                return calc(n) + calc1(--n);
            }调用时
    int n = 100;
    Console.WriteLine(calc1(n).ToString());
      

  15.   

    递归
    public int Sum(int num)
    {
    if(num==1)
    {return 1;}
    else
    {return num*(num-1);}
    }