博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
rust-计算无限循环小数的循环周期
阅读量:6671 次
发布时间:2019-06-25

本文共 1322 字,大约阅读时间需要 4 分钟。

hot3.png

简介

  • 任意的无限循环小数都可以用两个有理数组成的分数表示;
  • 无限循环小数也是有理数

算法

由于需求只是求出循环周期,因此不关心其小数形式。利用小学三年级计算除法的步骤。当除得的余数重复出现时,两次步骤之间的间隔数目即为小数但循环周期。

ps: 函数传入参数为两个u64.

code

code1

fn cycle(m:u64,n:u64) -> Option
{ use std::collections::HashMap; let mut residues = HashMap::new(); let mut residue = m%n; let mut count:u64 = 0; residues.insert(residue, count); loop{ count +=1; residue = (residue*10)%n; if residue == 0{ return None; } if let Some(res) = residues.get(&residue){ return Some(count-res); } residues.insert(residue, count); }}#[test]fn test() { //1.42857 142857 142857 ... assert!(Some(6) == cycle(10,7));}

code2

HashMap的好处是,hash查找的时间复杂度为O(1),每次查询所消耗的的时间固定。但缺点是每次查询都需要计算一次hash值,遇到hash碰撞还会使得性能下降。总的来说比较适合循环周期较长的情况。

代码中,hash表记录的值是这个余数出现的序数。可以用vec代替,则余数出现但序数就是该数在数组中的索引。“呆?!看代码。。。”

fn cycle(m:u64,n:u64) -> Option
{ let mut residues = vec![]; let mut residue = m%n; residues.push(residue); loop{ residue = (residue*10)%n; if residue == 0{ return None; } if let Some(res) = residues.iter().position(|&item|item==residue){ return Some((residues.len() -res) as u64); } residues.push(residue); }}

转载于:https://my.oschina.net/u/3703365/blog/2054771

你可能感兴趣的文章
DDD CQRS架构和传统架构的优缺点比较
查看>>
前端源码安全
查看>>
java二维数组的常见初始化
查看>>
关于开发WPF的一些感想
查看>>
UML介绍--用例图
查看>>
iOS 真机调试(史上最详细步骤解析,hmt精心打造)
查看>>
LVS三种模式与八种调度算法
查看>>
让定义的接口可读性更强
查看>>
WordPress上传含有中文文件出现乱码
查看>>
解析UIControl
查看>>
【MySQL】数据库字符校对规则
查看>>
分形几何算法和实现(C语言)
查看>>
设计模式[2]-Chain of Responsibility
查看>>
Nginx+Tomcat动静分离及Nginx优化(企业案例)
查看>>
软件事务内存导论(五)创建嵌套事务
查看>>
[翻译] ClockView 时钟
查看>>
Cocos2d-X-3.0之后的版本的环境搭建
查看>>
[翻译] TCBlobDownload
查看>>
阿里云DTS VS MySQLdump
查看>>
MonetDB 1.6 billion(384GB) JOIN 2.4 billion(576GB) 60 columns-random-data wide-table
查看>>