对于阶乘,你需要考虑到输入的数的大小,进行判断n0,无阶乘;n==0||n==1阶乘为1;
在余江等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站建设、成都网站制作 网站设计制作按需开发,公司网站建设,企业网站建设,品牌网站设计,网络营销推广,外贸网站制作,余江网站建设费用合理。
n1的就用户循环,或者调用函数来做
1.循环
#includestdio.h
void main()
{
float sum=1;
int n,i;
printf("please enter an integer number:");
scanf("%d",n);
printf("\n");
if (n0)
printf("n0,data error!\n");
else if(n1)
{
for(i=2;i=n;i++)
sum=sum*i;
printf("%d!=%10.0f\n",n,sum);
}
else
if(n==0||n==1)
{
sum=1;
printf("%d!=%10.0f\n",n,sum);
}
}
2.函数
#include stdio.h
void main()
{
float fac(int n);
int n;
float y;
printf("input an integer number:");
scanf("%d",n);
y=fac(n);
printf("%d!=%10.0f\n",n,y);
}
float fac(int n)
{
float f;
if(n0)
{
printf("n0,data error");
}
else
if(n==0||n==1)
f=1;
else
f=fac(n-1)*n;
return (f);
}
利用for循环计算1~100的阶乘,将1~100的阶乘累加到sum中就是所求。
#includestdio.h
void main()
{
int i;
double t=1,sum=0; //由于100的阶乘int和long int都放不下.所以用double.
for(i=1;i=100;i++) //从1循环到100.
{
t = t * i; //计算1~100的阶乘.
sum = sum + t; //将1~100的阶乘累加到sum中.
}
printf("%.0f\n",sum); //输出sum.
}
利用for循环计算1~100的阶乘,将1~100的阶乘累加到sum中就是所求。
1、打开Visual Studio,新建一个空白页面。
2、在Main函数的上方,我们写上阶乘函数的框架。
3、然后定义一个变量【result】。
4、然后输入if判断语句。
5、然后就可以写下程序的关键语句。
6、接下来就可以调用输出。
7、最后可以运行测试,这就完成了。
题目中数据很大
于是我们有了高精度算法
思路是什么呢:
一个数组里面每一位存的是十进制数三位(也可以只存一位,但是比较慢)
也可以理解成一千进制
这样能模拟大整数的乘法、加法
#includestdio.h
#includestring.h
#define max(a,b) (ab?a:b)
int n;
FILE * input, * output;
struct bigint
{
int len;
int num[1100];
}fac,sum;
void mul(int value){//高精度乘单精度
int i;
for (i=1;i=fac.len;i++)
fac.num[i]=fac.num[i]*value;//每个数位乘上数
for (i=1;i=fac.len;i++)
if (fac.num[i]=1000) {//逢千进一
fac.num[i+1]+=fac.num[i]/1000;fac.num[i]%=1000;
}
if (fac.num[fac.len+1]) fac.len++;//位数可能会增加,而且最多增加1
}
void add()//给sum加上fac的值
{
int i;
//由于此时fac永远大于sum所以不用判断sum的长度
for (i=1;i=fac.len;i++)
sum.num[i]+=fac.num[i];//每一位加上fac的值
for (i=1;i=fac.len;i++)
if (sum.num[i]=1000){//逢千进一
sum.num[i+1]++;sum.num[i]-=1000;//因为加法运算不可能往前进2
}
sum.len =fac.len;
if (sum.num[sum.len+1]) sum.len++;
}
void out()//输出
{
int i;
for (i=sum.len;i=1;i--)
{
if (isum.len) //压位高精度一定要判断位数
{//因为如果不是第一位,其他要补0,因为如果这个数是1001,就会变成11
if (sum.num[i]10) fprintf(output,"00");
else if (sum.num[i]100) fprintf(output,"0");
}
fprintf(output,"%d",sum.num[i]);
}
fputc('\n',output);
}
int main(){
input = fopen("factor.in","r");
output = fopen("factor.out","w");
memset(fac.num,0,sizeof fac.num);
memset(sum.num,0,sizeof sum.num);
fscanf(input,"%d",n);
int i;
fac.len = sum.len = 1;//初始赋成1
fac.num[1] = sum.num[1] = 1;
for (i=2;i=n;i++)
{
mul(i);
add();
}
out();
fclose(input);fclose(output);
return 0;
}