题目
对于任意的真分数 N/M ( 0 < N < M ),均可以求出对应的小数。如果采用链表表示各个小数,对于循环节采用循环链表表示,则所有分数均可以表示为如下链表形式。
输入: N M
输出: 转换后的小数(不超过 50 )
要求: 仅编写将分数转换为小数的函数 change( int n, int m, NODE * head ) 。
C完整代码
#include <stdio.h>
#include <stdlib.h> typedef struct node
{int data;struct node* next;
} NODE;void change(int n, int m, NODE* head)
{NODE* current = head; // 当前节点指针,初始指向头节点for (int i = 1; i <= 50; i++) // 循环50次,最多插入50个节点{if (n == 0) // 如果被除数为0,则退出循环{break;}else{n = n * 10; // 将被除数乘以10,以便获取下一个商int quotient = n / m; // 计算商n = n % m; // 计算余数NODE* newNode = (NODE*)malloc(sizeof(NODE)); // 创建新节点newNode->data = quotient; // 将商存储在新节点的数据域中current->next = newNode; // 将新节点连接到当前节点的后面current = newNode; // 将当前节点指针移动到新节点}}current->next = NULL; // 将最后一个节点的next指针置为NULL,表示链表结束
}void output(NODE* head)
{int k = 0;printf("0.");while (head->next != NULL && k < 50){printf("%d", head->next->data);head = head->next;k++;}printf("\n");
}int main()
{int n, m;NODE* head;scanf("%d%d", &n, &m);head = (NODE*)malloc(sizeof(NODE));head->next = NULL;head->data = -1;change(n, m, head);output(head);// 释放动态分配的内存空间NODE* current = head;while (current != NULL) {NODE* temp = current;current = current->next;free(temp);}return 0;
}