解题思路:重点是写一个求高精度阶乘的函数出来
注意事项:每一次循环,要重新初始化数组的值。
参考代码:
#include
#include
//求阶乘的函数
int jiecheng(int *a,int n)
{
int i,j,k,len=1;//len是数组的有效位数,一开始a[1]=1,所以数组有效长度为1
for(i=1;i<=n;i++)//n是多少就是谁的阶乘,例如n=3,则此处求的是3的阶乘结果
{
for(j=1;j<=len;j++)
{
a[j]*=i;/*乘于i,例如 将数组a的每一位都乘于 i.例如:3的阶乘==》 数组a的每一位数*1后,进位后得1!;之后的数组a,每一位数*2,进位后得2!;之后的数组a,每一位数*3,进位后得3!,这里的a数组是不断变化的!!!*/
}
for(k=1;k<=len;k++)
{
if(a[k]>9)
{
a[k+1]+=a[k]/10;//进位
a[k]%=10;
if(a[k+1]!=0&&k==len)
{
len++;//最高位要进位,数组要增加长度 //如例如len=2 a[1]=19 a[2]=9 则进位后a[1]=9 ,a[2]=9+1=10 ,a[2]进位后,a[2]=0 ,a[3]=1;此时len=3
}
}
}
}
return len;
}
int main()
{
int n;
scanf("%d",&n);
int i,j,k,t,max=0,sum[1000]={0},a[1000];
for(i=1;i<=n;i++)//全部要求阶乘的数
{
memset(a,0,sizeof(a));//设定所有a数组的初始值为 0
a[1]=1;//设定a[1]=1,因为乘法从a[1]开始。求阶乘就要设定a[1]=1;
t=jiecheng(a,i);//求每一阶乘结果,而且结果是倒序 ,t 是阶乘结果的长度
if(t>max)
{
max=t;//找最大的长度 ,max是sum数组的最大有效长度。
}
//阶乘结果相加
for(j=1;j<=t;j++)
{
sum[j]+=a[j];//存储结果
}
}
for(k=1;k<=max;k++)//结果转为十进制
{
if(sum[k]>9)
{
sum[k+1]+=sum[k]/10;//进位
sum[k]%=10;//本位
}
}
for(i=max;i>=1;i--)//输出
{
printf("%d",sum[i]);
}
return 0;
}
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:643 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:1158 |
printf基础练习2 (C语言代码)浏览:955 |
WU-格式化数据输出 (C语言代码)浏览:1818 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:490 |
循环入门练习5 (C语言代码)浏览:908 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:494 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:608 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:548 |
求圆的面积 (C++代码)浮点数有误差!!!浏览:724 |