有一个用链表求大数N的阶成的问题,帮我详细解释一下。急啊~

来源:百度知道 编辑:UC知道 时间:2024/06/05 07:11:13
就是这个程序,哪位大侠能帮我详细解释一下啊?
http://www.csdndoc.cn/ForumsView/t/20030520/15/1809379.html
就是这个网站12楼写的那个用单链表算大数N的阶成的那个程序,
我看不懂,请帮我详细解释一下,老师要,很急的,悬赏200。可再追加的。

程序我看过了,我理解它的算法原理应该是:
1).链表中每一个节点只能表示0~9之间的数,表示阶乘结果中的一位,如果阶乘结果有n位数,那么链表就有n个节点,并且顺序是由低位到高位保存的,所以需要逆序输出链表.

2).每次乘一个新的数后需要对链表中每个节点作取余和进位操作,例如: 要计算5的阶乘,那么应该是1*2*3*4*5,它是由1开始一直乘到5的,程序刚开始是i=1,完成了1阶乘的运算,初始的链表两个节点分别0和1(简写成01),后面的运算用到前面的结果,执行i++后计算1*2,即1!*2,方法是对所有节点由低位到高位分别乘2 ,即0*2=0,1*2=2,'%9'运算没有进位,'/9'运算后获得余数更新链表,此时链表状态变为02...假如执行到4!=24,此时链表的状态是042(倒序嘛,最低位0以后处理),那么i++后,在做5!=4!*5呢,就是对原来链表(042)的每个节点乘5,0*5=0,4*5=20大于9表示有进位,'%'运算后求得进位是2 ,'/'运算后知道余数是0,替换原来的4,2*5=10,加上上次进位后得12,值大于9表示有进位,同样方法求得进1余2,余数2保留,对于进位1,则新申请节点存放,最后得到链表状态是0021,逆序输出(处理掉低位0)是120.

原程序经过小小改动后,也许可以更直观(输出了部分中间结果):
#include<stdio.h>
#include<malloc.h>
struct number
{ int data;
struct number *next;
}num;
struct number *create(int n)/*从个位到高位循环*/
{
void disp(struct number *head);
int i=1,t,flag=0;
struct number *head