题目
对于任意的真分数 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;
}