Pagini recente » Cod sursa (job #947797) | Cod sursa (job #943204) | Cod sursa (job #43555) | Cod sursa (job #2585354) | Cod sursa (job #3301907)
use std::fs::File;
use std::io::Write;
use std::io::{self, BufRead};
fn gcd(a: i32, b: i32) -> i32 {
if b == 0 { a } else { gcd(b, a % b) }
}
fn lcm(a: i32, b: i32) -> i32 {
(a * b) / gcd(a, b)
}
fn main() {
let input = File::open("multiplu.in").expect("Unable to open file");
let mut out = File::create("multiplu.out").expect("Unable to create file");
let mut reader = io::BufReader::new(input);
let mut line = String::new();
reader.read_line(&mut line).expect("Unable to read line");
let nums = line
.trim()
.split_whitespace()
.map(|s| s.parse::<i32>().expect("Unable to parse number"))
.collect::<Vec<i32>>();
if nums.len() != 2 {
panic!("Expected exactly two numbers");
}
let (a, b) = (nums[0], nums[1]);
let m = lcm(a, b) as usize;
let mut up = vec![0; m];
let mut cif = vec![0; m];
let mut coada = vec![];
let mut in_coada: Vec<bool> = vec![false; m];
coada.push(1);
cif[0] = 1;
up[0] = 0;
in_coada[1] = true;
let mut i = 0;
while i < coada.len() {
// println!("coada[i] = {}", coada[i]);
let nr = (coada[i] * 10) % m;
if !in_coada[nr as usize] {
coada.push(nr);
cif[coada.len() - 1] = 0;
up[coada.len() - 1] = i;
in_coada[nr as usize] = true;
if nr == 0 {
break;
}
}
let nr = (coada[i] * 10 + 1) % m;
if !in_coada[nr as usize] {
coada.push(nr);
cif[coada.len() - 1] = 1;
up[coada.len() - 1] = i;
in_coada[nr as usize] = true;
if nr == 0 {
break;
}
}
i += 1;
}
let mut j = coada.len() - 1;
let mut stack = vec![];
while j > 0 {
stack.push(cif[j]);
j = up[j];
}
stack.push(cif[0]);
stack.reverse();
let result = stack
.iter()
.map(|&x| x.to_string())
.collect::<Vec<String>>()
.join("");
writeln!(out, "{}", result).expect("Unable to write to file");
}