2.求循环小数

题目

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

2.求循环小数_第1张图片

输入: N M

输出: 转换后的小数(不超过 50 )

要求: 仅编写将分数转换为小数的函数 change( int n, int m, NODE * head ) 。


C完整代码

#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;
}

你可能感兴趣的:(数据结构与算法设计,开发语言,c语言)