/***************************************************************************/
/*******************算1000的阶乘********************************************/
/************无论我怎么修改,得出的结果还是****0,也就是********************/
/***************************************************************************/
#include<stdio.h>
#include<math.h>
void gewei(int *p,int k); /*声明对个位数的相乘的函数*/
void shiwei(int *p,int j); /*声明对十位数的相乘的函数*/
void baiwei(int *p,int i); /*声明对百位数的相乘的函数*/
void jingwei(int *p,int m); /*当相乘的积大于10需要进位时,调用此函数完成进位功能*/
main()
{
int arr[1000]={0,0}; /*定义一个数组,存放结果的每一位数*/
int dyxh,i,j,k;
int e,f,g;
FILE *fp_new;
arr[996]=1; /*将千位数初始化为1*/
for(dyxh=0;dyxh<1000;dyxh++) /*通过三重for循环打印出 arr[1000]的初值。*/
{
printf("%d",arr[dyxh]);
}
printf("\a\n以上输出了arr[1000]的初值!大小为0…01000\n即将执行1000的阶乘!\n按任意键继续!\n");
getchar(); /*程序执行到这里暂停,便于查看分析程序*/
for(i=0;i<10;i++) /*百位上的数从0到9*/
for(j=0;j<10;j++) /*十位上的数从0到9*/
for(k=1;k<10;k++) /*个位上的数从0到9*/
{
for(e=1;e<1000;e++)
{
gewei(&arr[1000-e],k); /*对个位数的相乘的函数*/
}
for(f=2;f<1000;f++)
{
shiwei(&arr[1000-f],j); /*用j乘以十位数并通过进位函数完成进位*/
}
for(g=3;g<1000;g++)
{
baiwei(&arr[1000-g],i); /*用i乘以百位数并通过进位函数完成进位*/
}
}
printf("\n阶乘运算结束!\n按任意键输出arr[1000]的新值!\n");
getchar();
for(dyxh=0;dyxh<1000;dyxh++)
{
printf("%d",arr[dyxh]);
}
printf("\n输出结束!\n");
getchar();
}
void gewei(int *p,int k) /*个位处理函数*****p为arr[999](个位)的地址******k为当前数的个位数*/
{
int m;
m=*p*k;
if(m>9)
{
jingwei(p, m);
return;
}
else
*p=m;
}
void shiwei(int *p,int j) /*十位处理函数****p为arr[998](十位)的地址******k为当前数的十位数*/
{
int m;
m=*p*j;
if(m>9)
{
jingwei(p, m);
return;
}
else
*p=m;
}
void baiwei(int *p,int i) /*百位处理函数****p为arr[997](百位)的地址******k为当前数的个位数*/
{
int m;
m=*p*i;
if(m>9)
{
jingwei(p, m);
}
else
*p=m;
}
void jingwei(int *p,int m) /*进位处理函数******用递归调用完成进位功能*/
{
int a,b,c;
int *pjw;
pjw=p;
a=m%10; /*取得操作位的数*/ /* 进位操作 */
b=m/10; /*取得操作位的上一位的数*/
*pjw=a; /*将操作位上的数填入*/
pjw--; /*移动指针到前一地址*/
c=b+*pjw;
if (c>9)
{
jingwei(pjw,c);
}
else
*pjw=c;
}