循环小数(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);
}
相关推荐
醇氧1 小时前
【Windows】优雅启动:解析一个 Java 服务的后台启动脚本
java·开发语言·windows
华仔啊2 小时前
这 10 个 MySQL 高级用法,让你的代码又快又好看
后端·mysql
MapGIS技术支持2 小时前
MapGIS Objects Java计算一个三维点到平面的距离
java·开发语言·平面·制图·mapgis
码事漫谈2 小时前
国产时序数据库崛起:金仓凭什么在复杂场景中碾压InfluxDB
后端
上进小菜猪3 小时前
当时序数据不再“只是时间”:金仓数据库如何在复杂场景中拉开与 InfluxDB 的差距
后端
程序员zgh3 小时前
C++ 互斥锁、读写锁、原子操作、条件变量
c语言·开发语言·jvm·c++
小灰灰搞电子3 小时前
Qt 重写QRadioButton实现动态radioButton源码分享
开发语言·qt·命令模式
by__csdn3 小时前
Vue3 setup()函数终极攻略:从入门到精通
开发语言·前端·javascript·vue.js·性能优化·typescript·ecmascript
喵了meme3 小时前
C语言实战5
c语言·开发语言
盖世英雄酱581363 小时前
springboot 项目 从jdk 8 升级到jdk21 会面临哪些问题
java·后端