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(); } } }
如果n是10000,或者更大时,二楼的这个long就不行了
首先要考虑的就是用什么来存储这个结果...如果n很大的话,long型是肯定不够的.
其实这道题目的要点在于它的算法,一般人非常容易想到,算出每个数的阶乘,然后一个一个得相加,关键在于算阶乘的时候,如果图方便就每个数都从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); } }
大家看我这样写对不? 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 }}
实现方法很多,2楼的mytigo写的很好,建议楼主采用
public int calc(int n) { if (n == 1) return 1; return n + calc(--n); }
然后调用的时候 int n = 100; Console.WriteLine(calc(calc(n)).ToString());
上面错了,真丢脸,为何不能编辑啊 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());
递归 public int Sum(int num) { if(num==1) {return 1;} else {return num*(num-1);} }
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();
}
}
}
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);
}
}
这个问题要考虑的第一个就是去除重复的计算增加效率,然后要考虑的就是所使用的数据类型的存储范围。
double sum=0;
for(int i=1;i<=n;i++)
{
multi=multi*i;
sum=sum+multi;
}
正解,英雄所见很同
{
multi=multi*i;
sum=sum+multi;
}
学习一下
{
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();
}
}
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
}}
{
if (n == 1)
return 1;
return n + calc(--n);
}
int n = 100;
Console.WriteLine(calc(calc(n)).ToString());
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());
public int Sum(int num)
{
if(num==1)
{return 1;}
else
{return num*(num-1);}
}