fork download
  1. use std::io::{self, BufRead};
  2.  
  3. fn main() {
  4. let stdin = io::stdin();
  5. for line in stdin.lock().lines() {
  6. if line.is_ok() {
  7. let content = line.unwrap();
  8. let n: u32 = content.parse().unwrap();
  9. match reverse_factorial(n) {
  10. Some(rev) => {
  11. println!("{} = {}!", n, rev);
  12. },
  13. None => {
  14. println!("{} NONE", n);
  15. }
  16. }
  17. }
  18. }
  19. }
  20.  
  21. fn reverse_factorial(n: u32) -> Option<u32> {
  22. let mut num = n;
  23. let mut div = 2;
  24.  
  25. while num % div == 0 {
  26. num /= div;
  27. div += 1;
  28. }
  29.  
  30. if div % num == 0 {
  31. Some(div - 1)
  32. } else {
  33. None
  34. }
  35. }
  36.  
  37. #[cfg(test)]
  38. mod tests {
  39. use super::reverse_factorial;
  40.  
  41. #[test]
  42. fn it_generates_some_reverse_factorial() {
  43. let result = reverse_factorial(120);
  44. println!("{:?}", result);
  45.  
  46. assert!(result.is_some());
  47. assert_eq!(5, result.unwrap());
  48.  
  49. assert_eq!(10, reverse_factorial(3628800).unwrap());
  50. assert_eq!(12, reverse_factorial(479001600).unwrap());
  51. assert_eq!(3, reverse_factorial(6).unwrap());
  52. }
  53.  
  54. #[test]
  55. fn it_generates_none_reverse_factorial() {
  56. let result = reverse_factorial(150);
  57. println!("{:?}", result);
  58.  
  59. assert!(result.is_none());
  60.  
  61. assert!(reverse_factorial(18).is_none());
  62. }
  63. }
Success #stdin #stdout 0s 12000KB
stdin
120
150
3628800
479001600
6
18
stdout
120 = 5!
150 NONE
3628800 = 10!
479001600 = 12!
6 = 3!
18 NONE