输入整数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
解法
就是模拟竖式除法
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);
}