标签:
对于任意的真分数 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("\n"); } 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即可。
注意循环结束条件,避免数组越界。
标签:
原文地址:http://www.cnblogs.com/weir007/p/5977702.html