用TC2.0求n!的值~~~由用
给你一个构想应该行得通:
由于一个比较大的数的阶乘结果太大,位数也不稳定,你可以用一个链表来存储这个数,链表的节类是long类, 每一个节点代表一位数, 如第二个节点代表个位,第二个节点代表十位,第三个节点代表百位。 。。 当然一个long节点可以代表7~8位,但这样稍微加重了一点你的脑力负担。。。 如果你切实为用户着想的话,建议你用第二种方法。 这里讲第一种方法比较简单。这个链表在乘一个数的时候,从链表的第一个节点(个位),每个节点都乘以这个数(链表节点里存的都是个位数,乘一个7位数还撑得下)。 然后进位,进位有一定的方法,自己想吧,(这个程序n!中n的位数要小于8,想来你也用不着...全部
给你一个构想应该行得通:
由于一个比较大的数的阶乘结果太大,位数也不稳定,你可以用一个链表来存储这个数,链表的节类是long类, 每一个节点代表一位数, 如第二个节点代表个位,第二个节点代表十位,第三个节点代表百位。
。。 当然一个long节点可以代表7~8位,但这样稍微加重了一点你的脑力负担。。。 如果你切实为用户着想的话,建议你用第二种方法。 这里讲第一种方法比较简单。这个链表在乘一个数的时候,从链表的第一个节点(个位),每个节点都乘以这个数(链表节点里存的都是个位数,乘一个7位数还撑得下)。
然后进位,进位有一定的方法,自己想吧,(这个程序n!中n的位数要小于8,想来你也用不着算这么大的数。。就算用得着你的电脑也未必算得出来。。。)我只有C++的版本,发出来你也不要,就这样吧
(真不幸你还用TC)
/*12。
26 12:51修改 程序绝对没有错。错就错在你都21世纪了还在用TC。。赶快去买张盗版VC碟算了,也就3块钱,,刚才把你要的程序补齐了,能不能在TC里编译就看你的命了。。。。*/
#include
void *malloc(int);
void free(void *);
struct node{
unsigned long data;
struct node *Next,*Pro;
};
struct link{
struct node *First,*Current,*Last;
};
void Insert(struct link *x,struct node *y){
y->Pro=x->Current,y->Next=x->Current->Next;
if(x->Last==x->Current)
x->Last=y;
x->Current=x->Current->Next=y;
}
void Translate(struct link *x,unsigned long y){ /*把y转成链表形式附加到x后面,重要*/
do{
struct node *NewNode;
NewNode=(struct node *)malloc(sizeof(struct node));
NewNode->data=y%10;
Insert(x,NewNode);
}while((y/=10)>=1);
}
main(){
struct node FirstNode,*Forfree;
struct link LongInt;
unsigned long n,ncount;
char c;
do{ /*带表头结点的双向链表*/
LongInt。
First=LongInt。Last=LongInt。Current=FirstNode。Pro=FirstNode。Next=&FirstNode;
printf("Please Input n : ");
scanf("\n%d",&n);
ncount=n;
Translate(&LongInt,n); /*先把n转成链表*/
while (--ncount){ /*这种语法也不知道TC20能不能正确编译。
。。*/
unsigned long Ncarry=0;
LongInt。Current=LongInt。First;
do{
LongInt。Current=LongInt。
Current->Next;
LongInt。Current->data*=ncount; /*先乘以ncount*/
LongInt。Current->data+=Ncarry; /*再加上前一位的进位*/
Ncarry=LongInt。
Current->data/10; /*算出往后一位该进位的数*/
LongInt。Current->data%=10; /*把结果的个位数存储在当前位置*/
}while(LongInt。
Current!=LongInt。Last);
if(Ncarry)
Translate(&LongInt,Ncarry); /*把最高位数的进位数转成链表附加到后面*/
}
for(;LongInt。
Current!=LongInt。First;ncount++){
Forfree=LongInt。Current;
printf("%d",Forfree->data);
LongInt。
Current=LongInt。Current->Pro;
free(Forfree);
} /*倒序输出,一边输出一边析构*/
printf("\n");
printf(" %d digit of all,Would you like to calculate another one?(Y/N) : ",ncount);
scanf("\n%c",&c);
}while(c=='y'||c=='Y');
}
/*在后面点评一下楼下的观点: 链表是最基本的数据结构之一,怎么能说复杂?
程序是给用户编的, 程序不是写得越短就越好,而是对用户越方便越省系统资源越好 ,你用数组程序也就短个十行八行的。
但多占了不少用户的内存,或者可能存不下结果(今天心血来潮算了一下10000! ,有35660位数~~)*/
。收起