第1个回答 2008-12-10
#include <iostream.h>
//Fa是英语阶乘的开头字母、下面是阶乘函数,实现一个数的阶乘
long Fa(int n)
{
int fa=1;
//for循环实现1*2*...n
for(int i=1;i<=n;i++)
fa=fa*i;
return fa; //返回fa即n!
}
// Add累加函数实现 各个数阶乘的相加即1!+2!...+n!
long Add(int n)
{ int sum=0;
for(int i=1;i<=n;i++)
sum=sum+Fa(i);//调用Fa()函数并循环叠加
return sum;//sum的值即是1!+2!...+n!
}
void main()
{
long result=0;int n=0;
cout<<"please input the number of n"<<endl;
cin>>n;
result=Add(n);//调用Add函数
cout<<result<<endl;
}
第2个回答 2008-12-10
这个是高精度的,如果n大于等于20的话。肯定就越界了。所以只能用这个高精度。如果你的n很小的话。你就用上面的别人的吧。
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int carry,n,j; //carry低位超过10向高一位进的数,n阶层数,j数据位数
int a[2000]; //表示数据值的数组
int digit=1; //数据总位数
int temp,i; //temp临时变量,i当前阶层的乘数
cout<<"please enter n:"<<endl;
cin>>n;
a[0]=1;
for(i=2; i<=n; i++)
{
for(carry=0,j=1; j<=digit; ++j) //向数组中的每一位乘i
{
temp=a[j-1]*i+carry; //temp保存当前乘的结果加上低位进数
a[j-1]=temp%10; //让数组保存当前位的值(0 ~ 9)
carry=temp/10; //需要向高位进carry
}
while(carry) //当最高位需要进位时,carry保存需要向更高位进的数
{
//digit++;
a[++digit-1]=carry%10; //总数据位数加1,新最高位保存数据
carry/=10; //新最高位需要向新更高位进的数
}
}
cout<<"the result is:"<<endl;
for(int k=digit; k>=1; --k)
cout<<a[k-1];
cout<<endl;
return 0;
}
第3个回答 2008-12-10
#include <stdio.h>
#include <math.h>
#include <conio.h>
main()
{
float n,i=1,Ji=1,sum=0;
printf("Please input n:");
scanf("%f",&n);
while(i<=n)
{
Ji*=i;sum+=Ji;
i++;
}
printf("sum=%e\n",sum);
getch();
}
比如输入20.结果就是2.56133e+18
第4个回答 2008-12-10
#include<stdio.h>
float layer(int n);
main()
{
int i,n;float sum=0;
printf("Enter a number:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum=sum+layer(i);
}
printf("1!+2!+...+%d!=%4f",n,sum);
}
float layer(int n)
{
int j,t=1;
for(j=1;j<=n;j++)
{
t=t*j;
}
return(t);
}
^.^
第5个回答 2008-12-10
如果要递归求阶乘就慢了,可以使用动态规划:
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[])
{
int n;
int i, s = 1, sum = 0;
cout<<"n=?"<<endl;
cin>>n;
for (i=1; i<=n; i++)
{
s *= i; //计算i的阶乘值
sum += s;//累加阶乘值
}
printf("%d\n", sum);
system("pause");
return 0;
}