70,037
社区成员
发帖
与我相关
我的任务
分享#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int n;
struct node * next;
} NODE;
NODE * jc(int);
void print(NODE *);
int main()
{
for(int n = 1; n < 36; n++){
print(jc(n));
printf("\t%d\n",n);
}
return 0;
}
void print(NODE * head) {
if(head) {
print(head->next);
printf("%1d", head->n);
free(head);
}
}
NODE * newnode(int n) {
NODE * head;
head = (NODE *)malloc(sizeof(NODE));
head->n = n;
head->next = NULL;
return head;
}
void jw(NODE * head, long n) {
if(n>0) {
if(n>=10 && head->next == NULL) head->next = newnode(0);
int x = head->n + n%10;
head->n = x%10;
jw(head->next, x/10);
jw(head->next, n/10);
}
}
NODE * lj(NODE * head, int n) {
if(head) {
lj(head->next, n);
long x = head->n * n;
head->n = 0;
jw(head, x);
}
return head;
}
NODE * jc(int n) {
return n==1 ? newnode(1) : lj(jc(n-1), n);
}
#include <stdio.h>
#include <stdlib.h>
//定义一个结构体,一位十进制数和指向上一位数的结点的指针(表头是结果的最后一位)
typedef struct node {
int n;
struct node * next;
} NODE;
NODE * jc(int);
void print(NODE *);
int main()
{
for(int n = 1; n < 36; n++){
print(jc(n));
printf("\t%d\n",n);
}
return 0;
}
//输出结果,因为接收到的指针是表头,也就是结果的最后一位,所以先打印前面所有的位,然后打印当前位,当到达表尾时(head=NULL),递归开始返回,这样正好就从表尾一项一项往前打印了
void print(NODE * head) {
if(head) {
print(head->next);
printf("%1d", head->n);
free(head);
}
}
//这个函数就是申请一个可以存储新结点信息的内存空间,参数是给新结点赋值的,有点多余,写的时候欠考虑,用上了参数,感觉并不应该影响正常运行,就没改,发动它,其它部分也要发动,
NODE * newnode(int n) {
NODE * head;
head = (NODE *)malloc(sizeof(NODE));
head->n = n;
head->next = NULL;
return head;
}
//这个函数是用来做进位的,因为每个节点只存储一位,所以就要考虑到进位问题
//如,表中存储个2 3 4 5 的列表,当一个乘积是999时,就要考虑怎么把这个999加到这个列表中,列表中的数打印出来是5432,,加上个999应该是6431,过程是这样的
//取最后一个9,5432+9,,然后取倒数第二位9,,前面的数变成 5441, 最后一位不支,变成544+9,,,然后再取倒数第三位9, 结果553中的3也不动了,变成55+9,,最后结果就是1,3,4,6(最终打印是从后向前的)
void jw(NODE * head, long n) {
if(n>0) {
if(n>=10 && head->next == NULL) head->next = newnode(0);
int x = head->n + n%10;
head->n = x%10;
jw(head->next, x/10);
jw(head->next, n/10);
}
}
//这个函数就是用当前列表中的值去"乘"n,只要N先与高位乘,就不用另外的空间存中间结果,一部一部向最低位乘,然后处理进位就行了,
NODE * lj(NODE * head, int n) {
if(head) {
lj(head->next, n);
long x = head->n * n;
head->n = 0;
jw(head, x);
}
return head;
}
//这个是阶乘函数,应该很容易理解了,如果n是1,就返回一个存放着1值的结点(1的阶乘1),那就返回n-1的阶乘,再乘上N的结果
NODE * jc(int n) {
return n==1 ? newnode(1) : lj(jc(n-1), n);
}
void jw(NODE * head, long n) {
if(n>0) {
int x = head->n + n%10;
head->n = x%10;
if((x>=10 || n>=10) && head->next == NULL) head->next = newnode(0);
jw(head->next, x/10);
jw(head->next, n/10);
}
}