use rand::Rng; use std::fs::File; use std::io::Write; use std::process::Command; use num_rational::Rational32; use num_integer::Integer; fn xerar_fraccion_aleatoria() -> (i32, i32) { let mut rng = rand::thread_rng(); let numerador: i32 = rng.gen_range(1..=10); let denominador: i32 = rng.gen_range(1..=10); (numerador, denominador) } fn simplificar_fraccion(numerador: i32, denominador: i32) -> String { let fraccion = Rational32::new(numerador, denominador); if fraccion.is_integer() { format!("{}", fraccion.to_integer()) } else { format!("\\frac{{{}}}{{{}}}", fraccion.numer(), fraccion.denom()) } } fn xerar_operacion_con_fraccions() -> String { let mut rng = rand::thread_rng(); let (a, b) = xerar_fraccion_aleatoria(); let (c, d) = xerar_fraccion_aleatoria(); let operacion = rng.gen_range(0..4); let (operacion_str, resultado) = match operacion { 0 => ( format!("\\frac{{{}}}{{{}}} + \\frac{{{}}}{{{}}}", a, b, c, d), simplificar_fraccion(a * d + b * c, b * d), ), 1 => ( format!("\\frac{{{}}}{{{}}} - \\frac{{{}}}{{{}}}", a, b, c, d), simplificar_fraccion(a * d - b * c, b * d), ), 2 => ( format!("\\frac{{{}}}{{{}}} \\times \\frac{{{}}}{{{}}}", a, b, c, d), simplificar_fraccion(a * c, b * d), ), 3 => ( format!("\\frac{{{}}}{{{}}} \\div \\frac{{{}}}{{{}}}", a, b, c, d), simplificar_fraccion(a * d, b * c), ), _ => unreachable!(), }; format!( "\\subsection*{{\\( {} \\)}}\n\\textbf{{Solución:}} \\( {} \\)\n", operacion_str, resultado ) } fn main() { let mut latex_content = String::from(r#" \documentclass{article} \usepackage{amsmath} \usepackage{multicol} \begin{document} "#); for i in 1..=10 { if i > 1 { latex_content.push_str(r"\newpage"); } latex_content.push_str(&format!("\\section*{{Boletín {}}}\n", i)); latex_content.push_str(r"\begin{multicols}{2}"); for _ in 0..20 { latex_content.push_str(&xerar_operacion_con_fraccions()); } latex_content.push_str(r"\end{multicols}"); } latex_content.push_str(r"\end{document}"); let mut file = File::create("boletins_fraccions.tex").expect("Non se puido crear o arquivo"); file.write_all(latex_content.as_bytes()).expect("Non se puido escribir no arquivo"); // Compilar o arquivo LaTeX en PDF usando pdflatex Command::new("pdflatex") .arg("boletins_fraccions.tex") .output() .expect("Erro ao executar pdflatex"); }