对于任意的真分数 N/M ( 0 < N < M ),均可以求出对应的小数。如果采用链表存储各位小数,对于循环节采用循环链表表示,则所有分数均可以表示为如下链表形式。
正在上传…重新上传取消
输入: N M
输出: 整个循环节
要求:
编写一个尽可能高效的查找循环节起始点的函数: NODE * find( NODE * head, int * n ) 。函数的返回值为循环节的起点(即图中的指针p),n为循环节的长度。
说明:提交程序时请同时提交将分数转换为小数的函数 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;
- NODE * find( NODE * , int * );
- void outputring( NODE * );
- void change( int , int , NODE * );
- void outputring( NODE * pring )
- { NODE * p;
- p = pring;
- if ( p == NULL )
- printf("NULL");
- else
- do
- { printf("%d", p->data);
- p = p->next;
- } while ( p != pring );
- printf("\n");
- return;
- }
- int main()
- { int n, m;
- NODE * head, * pring;
- scanf("%d%d", &n, &m);
- head = (NODE *)malloc( sizeof(NODE) );
- head->next = NULL;
- head->data = -1;
- change( n, m, head );
- pring = find( head, &n );
- printf("ring=%d\n", n);
- outputring( pring );
- return 0;
- }
- /* Here is waiting for you.
- void change( int n, int m, NODE * head )
- {
- }
- NODE * find( NODE * head, int * n )
- {
- }
- */
- /* PRESET CODE END - NEVER TOUCH CODE ABOVE */
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 7 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 8 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 9 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} NODE;
NODE *find( NODE *, int * );
void outputring( NODE * );
void change( int, int, NODE * );
void outputring( NODE *pring ) {
NODE *p;
p = pring;
if ( p == NULL )
printf("NULL");
else
do {
printf("%d", p->data);
p = p->next;
} while ( p != pring );
printf("\n");
return;
}
int main() {
int n, m;
NODE *head, *pring;
scanf("%d%d", &n, &m);
head = (NODE *)malloc( sizeof(NODE) );
head->next = NULL;
head->data = -1;
change( n, m, head );
pring = find( head, &n );
printf("ring=%d\n", n);
outputring( pring );
return 0;
}
int p1, p2, flag = 0;
void change( int n, int m, NODE *head ) {
int shang[1000] = {0}, yu[1000] = {0};
NODE *p, *q, *r;
int i, j;
p = head;
n = n * 10;
for (i = 0;; i++) {
shang[i] = n / m;
yu[i] = n % m;
for (j = 0; j < i; j++) {
if (shang[i] == shang[j] && yu[i] == yu[j]) {
p1 = j;
p2 = i - 1;
flag = 1;
break;
}
}
n = yu[i] * 10;
if (n == 0) {
flag = 2;
break;
}
if (flag == 1)
break;
}
if (flag == 2) {
for (j = 0; j <= i; j++) {
q = (NODE *)malloc(sizeof(NODE));
q->data = shang[j];
p->next = q;
p = q;
}
p->next = NULL;
}
if (flag == 1) {
for (j = 0; j <= p1; j++) {
q = (NODE *)malloc(sizeof(NODE));
q->data = shang[j];
p->next = q;
p = q;
}
r = p;
for (j = p1 + 1; j <= p2; j++) {
q = (NODE *)malloc(sizeof(NODE));
q->data = shang[j];
p->next = q;
p = q;
}
p->next = r;
}
}
NODE *find( NODE *head, int *n ) {
if (flag == 2) {
*n = 0;
return NULL;
}
if (flag == 1) {
NODE *p = head->next;
*n = p2 - p1 + 1;
for (int i = 0; i < p1; i++)
p = p->next;
return p;
}
}