热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求循环节

求循环节题目信息输入输出要求前置代码解答题目信息对于任意的真分数NM(0

求循环节

  • 题目信息
    • 输入
    • 输出
    • 要求
    • 前置代码
  • 解答
题目信息

对于任意的真分数 N/M ( 0 《求循环节》

输入

N M

输出

整个循环节

要求

编写一个尽可能高效的查找循环节起始点的函数: NODE * find( NODE * head, int * n )。函数的返回值为循环节的起点(即图中的指针p),n为循环节的长度。请同时提交将分数转换为小数的函数 change( int n, int m, NODE * head )

前置代码

#include
#include
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 ) { } */

测试输入期待输出
测试用例11 3ring=1
3
测试用例21 8ring=1
NULL
测试用例329 33ring=1
87
测试用例42 7ring=6
285714
解答

void change(int n, int m, NODE *head)
{ // 2/7 = 0.285714
NODE **array;//开辟一个数组,数组的内容是链表
NODE *p = head;//将head引向p
array = (NODE **) malloc(sizeof(NODE *) * m);//开辟的数组大小为链表头节点的大小*m,此处相当于开辟了7个
for (int k = 0; k < m; k++)
array[k] = NULL;
while (n != 0)
{
if (n * 10 % m == 0)
{ //恰好整除
p->next = (NODE *) malloc(sizeof(NODE));
p->next->data = n * 10 / m;
p->next->next = NULL;
n = 0;
}
else
{ //未整除情况
if (array[n] == NULL)
{ //该余数是第一次出现
array[n] = p->next = (NODE *) malloc(sizeof(NODE));//为后续下一个节点开辟空间,
// 同时也在array数组中记录下了是否出现过这个余数
p->next->data = n * 10 / m;//下一个节点的数据为第一次的除数2
n = n * 10 % m;//n此时被改变为余数
p = p->next;//p挪向下一个节点
}
else
{ //该余数不是第一次出现,则发现循环节
p->next = array[n];
n = 0;
}
}
}
}
NODE *find(NODE *head, int *n)
{
NODE *p, *q;
p = q = head->next;//p和q均指向head
while (p != NULL && q != NULL)
{
p = p->next;
q = q->next;
if (q != NULL)//q一次向后移动两个
q = q->next;
if (p == q)
break;//找到重合点则退出
}
if (q == NULL)
{ //如果q一直指向最后还没有找到重合的点那么就不循环了
*n = 0;
return NULL;
}
int ring = 1;
while (q->next != p)
{ //求环长
q = q->next;//q走的快,让q再走回来
ring++;
}
int count = 0;
q = p = head->next;//再一次从头开始
while (count < ring)
{ //p先向前走循环节步长的长度
count++;
p = p->next;
}
while (p != q)
{ //如果pq不相等说明未找到恰好一起的地方,还在前面非循环节的位置
p = p->next;
q = q->next;
}
*n = ring;
return p;
}

推荐阅读
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
author-avatar
奶牛还在Henry
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有