对于任意的真分数 N/M ( 0 < N < M ),均可以求出对应的小数。如果采用链表表示各个小数,对于循环节采用循环链表表示,则所有分数均可以表示为如下链表形式。

输入: N M
输出: 转换后的小数(不超过 50 )
要求: 仅编写将分数转换为小数的函数 change( int n, int m, NODE * head ) 。
- #include
- #include
-
- 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;
- }
-