求循环小数

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

此题需要提交所有代码,不能只提交子函数change。

循环节

输入: N M

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

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

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{   int         data;
    struct node * next;
} NODE;

void output( NODE * );
void change( int, int, NODE * );

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("
");
}

void change(int n, int m, NODE * head)
{
    int a = n, b[50] = {0}, i=0, j=0;
    NODE * tmp = NULL;
    NODE * p = NULL, *q = head;
    do
    {
        b[i++] = a *= 10;
        for (p = head->next, j=0; p!=NULL && j<i-1; p=p->next)
        {
            if (b[j++] == a)
            {
                q->next = p;
                return;
            }
        }
        tmp = (NODE *)malloc(sizeof(NODE));
        tmp->data = a / m;
        a %= m;
        q->next = tmp;
        q = tmp;
        q->next = NULL;
    }
    while (a && i<50);
}

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 );
    return 0;
}

  每位除法的余数作为判断循环的依据,必须被存储,而结构体NODE中没有该域,所以单独申请一个数组,遵照题意,输出长度不会超过50位,所以数组开到50即可。

  注意循环结束条件,避免数组越界。

原文地址:https://www.cnblogs.com/weir007/p/5977702.html