循环小数(Repeating Decimals, ACM/ICPC World Finals 1990, UVa202)rust解法

输入整数a和b(0≤a≤3000,1≤b≤3000),输出a/b的循环小数表示以及循环节长度。例如a=5,b=43,小数表示为0.(116279069767441860465),循环节长度为21。

样例

复制代码
1 59
0.(01694915254237288135593220338983050847457627118644...) 58
1 397
0.(00251889168765743073047858942065491183879093198992...) 99

解法

就是模拟竖式除法

rust 复制代码
use std::{collections::HashMap, io};

fn main() {
    let mut buf = String::new();
    io::stdin().read_line(&mut buf).unwrap();
    let mut it = buf.split_whitespace();
    let a: u32 = it.next().unwrap().parse().unwrap();
    let b: u32 = it.next().unwrap().parse().unwrap();

    if a % b == 0 {
        println!("{}.(0) {}", a / b, 1);
        return;
    }
    let mut m = a % b;
    let n = b;
    let mut r = 0;
    let mut ans = String::from(".");
    let mut kv = HashMap::new(); //记录被除数在第几个次上商时出现过
    loop {
        m *= 10; //产生新被除数
        if kv.contains_key(&m) {
            //同一个被除数出现第二次
            let pos = kv.get(&m).unwrap();
            r = ans.len() - pos; // 循环节长度
            if r > 50 {
                ans.drain(pos + 50..);//删除后面超出50长度的字符
                ans.push_str("...")
            }
            ans.insert(*pos, '('); //在第一次出现此被除数的上商位置插入'('
            ans.push(')');
            break;
        } else {
            kv.insert(m, ans.len());
            ans += &(m / n).to_string(); //上商
            m = m % n;
            if m == 0 {
                //如果发现被除数为0,则直接在ans后加上(0)即可
                ans.push_str("(0)");
                r = 1;
                break;
            }
        }
    }
    println!("{}{} {}", a / b, ans, r);
}
相关推荐
橘子编程几秒前
操作系统原理:从入门到精通全解析
java·linux·开发语言·windows·计算机网络·面试
唔662 分钟前
原生 Android(Kotlin)仅串口「继承架构」完整案例二
android·开发语言·kotlin
错把套路当深情3 分钟前
Kotlin 全方向开发技术栈指南
开发语言·kotlin
飞Link9 分钟前
LangGraph 核心架构解析:节点 (Nodes) 与边 (Edges) 的工作机制及实战指南
java·开发语言·python·算法·架构
hhhhhaaa12 分钟前
SpringBoot 自定义参数解析器实现请求统一封装实践
后端
何陋轩22 分钟前
Java线程池从入门到精通:框架自带 vs 自定义,我该怎么选?
后端
武藤一雄41 分钟前
WPF中ViewModel之间的5种通讯方式
开发语言·前端·microsoft·c#·wpf
XiYang-DING43 分钟前
【Java】堆
java·开发语言
Lyyaoo.1 小时前
【Java基础面经】Java 反射机制
java·开发语言·python
货拉拉技术1 小时前
数据质量告警平台的建设与应用实践
后端