循环小数(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);
}
相关推荐
CHANG_THE_WORLD38 分钟前
Rustup 安装加速:使用国内镜像源解决下载慢问题
rust·rustup
Boilermaker19921 小时前
【Java EE】Mybatis-Plus
java·开发语言·java-ee
aramae1 小时前
C++ -- STL -- vector
开发语言·c++·笔记·后端·visual studio
Tony小周1 小时前
实现一个点击输入框可以弹出的数字软键盘控件 qt 5.12
开发语言·数据库·qt
lifallen1 小时前
Paimon 原子提交实现
java·大数据·数据结构·数据库·后端·算法
lixzest1 小时前
C++ Lambda 表达式详解
服务器·开发语言·c++·算法
沉默媛2 小时前
如何安装python以及jupyter notebook
开发语言·python·jupyter
舒一笑2 小时前
PandaCoder重大产品更新-引入Jenkinsfile文件支持
后端·程序员·intellij idea
_Chipen2 小时前
C++基础问题
开发语言·c++
PetterHillWater3 小时前
AI编程之CodeBuddy的小试
后端·aigc