⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 n!的求解.txt

📁 本人初学c语言程序不是很拿手
💻 TXT
字号:



程序如下: 

#include
#include
struct number
{ int data;
struct number *next;
}num;
struct number *create(int n) /*从个位到高位循环*/
{ int i=1,t,flag=0;
struct number *head,*r,*p,*s;
head=(struct number *)malloc(sizeof(num)) ;
head->next=NULL;
s=(struct number *)malloc(sizeof(num));
if(head->next==NULL)
{ head->next=s;head->data=0; }
head->next->data=1;
s->next=NULL;
while(i<=n) /*先乘后加*/
{ r=head->next;
while(r!=NULL)
{ t=r->data*=i; flag=0;
if(t>9&&r->next==NULL)
{ r->data=t%10; t/=10;
s=(struct number *)malloc(sizeof(num));
s->data=t%10; s->next=NULL;
r->next=s; r=s;
t/=10;
while(t>0)
{ s=(struct number *)malloc(sizeof(num));
s->data=t%10; s->next=NULL;
r->next=s; r=s;
t/=10;
}
}
r=r->next;
}
p=head->next;
while(p!=NULL)
{
t=p->data;
if(t>9)
{
p->data=t%10;
t/=10;
p=p->next; /*注意和的[··]关系*/
p->data+=t;
if(p->data>9)
{ flag=p->data;
p->data=flag%10;
flag/=10;
p->next->data+=flag; /*连续进两位以上*/
}
}
while(t>9&&p->next==NULL)
{ if(t>0)
{ p->data=t%10; t/=10;
s=(struct number *)malloc(sizeof(num));
s->data=t%10; s->next=NULL;
p->next=s; p=s;
t/=10;
}
}
p=p->next;
}
i++;
}
head=head->next; /*[··]*/
return head;
}
void disp(struct number *head) /*输处联表*/
{ while(head!=NULL)
{ printf('%d',head->data);
head=head->next;
}
printf('\n');
}
struct number *move(struct number *h) /*链表倒置*/
{ struct number *p,*q,*r=h;
q=h->next;p=h;
while(q!=NULL)
{ r=q->next; q->next=p;
p=q; q=r;
}
h->next=NULL;
h=p;
return(h);
}
main()
{ int d;
struct number *h,*p;
printf('Please input the N! number :');
scanf('%d',&d);
if(d==0)
{ printf('\nThe Result is : %d\n',d+1);
return 0;
}
h=create(d);
h=move(h);
printf('\nThe Result is : ');
disp(h);
printf('\n');
}

方法2
这个程序写得比较乱,没好好整理.因为数字大于700的话就要超出屏幕了,所以就用科学表示方法了,其实程序有点浪费空间的,有些地方还可以改进的.
/*跳蚤侦探2003.9.26*/
#define N 3000
void pr1(int *num)/*科学方式输出阶层*/
{
int i,j;
for(i=0;;i++)
if(num[i]!=0)
{
printf('%d',num[i]);
printf('.');
for(j=i+1;j<=i+11;j++)
printf('%d',num[j]);
printf('e+');
printf('%d\n',N-i-1);
break;
}
}
void pr(int *num)/*输入结果*/
{int i,j;
for(i=0;;i++)
if(num[i]!=0)
{
for(j=i;j printf('%d',num[j]);
break;
}
printf('\n');
}
fun(int num[],int numx[],int x,int y)/*相乘结果函数*/
{int t[N],i,j,k,tt[N]={0};/*tt数组用来存放竖式的每一行*/
for(i=0;i {t[i]=num[i];num[i]=0;}
for(i=3;i>=3-y;i--)/*1位到3位的乘法*/
{
for(j=N-1;j>=N-x;j--)
tt[j+i-3]=numx[i]*t[j];/*记录数式*/
for(j=N-1;j>=1;j--)/*这里其实可以用个变量来算每一行到第几位,这样可以节约时间*/
if(tt[j]>=10)
{
tt[j-1]+=tt[j]/10;
tt[j]=tt[j]%10;
}
for(j=0;j {num[j]+=tt[j];tt[j]=0;}
}
for(i=N-1;i>=N-x;i--)/*结果进位*/
if(num[i]>=10)
{
num[i-1]+=num[i]/10;
num[i]=num[i]%10;
}
}
main()
{int num[N]={0},numx[4]={0},i,x,y;
int jx,jy=0;
clrscr();
printf('please input n: ');
scanf('%d',&jx);
num[N-1]=1;/*一直用来乘的变量初始值*/
while(1)
{
jy++;
numx[3]++;
if(numx[3]==10)
{numx[3]=0;numx[2]++;}
if(numx[2]==10)/*个位数进位*/
{numx[2]=0;numx[1]++;}
if(numx[1]==10)/*十位数进位*/
{numx[1]=0;numx[0]++;}
for(i=0;i if(num[i]!=0)
break;
x=N-i;/*求结果的位数*/
for(i=0;i<4;i++)
if(numx[i]!=0)
break;
y=4-i;/*求阶层的位数*/
fun(num,numx,x,y);/*传递过去的两个数,x是结果的位数,y是阶层的位数*/
if(jy==jx)/*阶层大小的判断*/
break; } printf('%d!=',jx);/*输出结果*/ if(jx<=700) pr(num); else pr1(num); getch();} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -