euler/
euler.rs

1use oint::indeterminate_eq;
2use oint::oi64;
3use oint::ou32;
4use oint::ou64;
5
6fn problem1() -> ou32 {
7    let mut sum: ou32 = 0.into();
8    for i in 0..1000 {
9        if ((i % 3) == 0) || ((i % 5) == 0) {
10            sum = sum + i;
11        }
12    }
13    return sum;
14}
15
16fn problem2() -> ou64 {
17    let mut sum: ou64 = 0.into();
18    let mut prev: ou64 = 0.into();
19    let mut next: ou64 = 1.into();
20    loop {
21        match *next {
22            None => return ou64::from(None),
23            Some(i) if i >= 4_000_000 => break,
24            Some(i) => {
25                if i % 2 == 0 {
26                    sum = sum + next;
27                }
28                next = next + prev;
29                prev = i.into();
30            }
31        }
32    }
33    return sum;
34}
35
36fn problem3() -> ou64 {
37    let mut maximum: ou64 = 0.into();
38    let mut n: ou64 = 600_851_475_143.into();
39    let sqrt_n = 775_146;
40    let mut i: u64 = 3;
41    while i <= sqrt_n {
42        loop {
43            match *(n % i) {
44                None => return ou64::from(None),
45                Some(0) => {
46                    maximum = maximum.max(i.into());
47                    n = n / i;
48                }
49                Some(_) => break,
50            }
51        }
52        i = i + 2;
53    }
54    match *n {
55        None => return ou64::from(None),
56        Some(val) if val > 2 => maximum = maximum.max(n),
57        _ => {}
58    }
59    return maximum;
60}
61
62fn palindrome(x: u64) -> bool {
63    let x: ou64 = x.into();
64    let mut rev: ou64 = 0.into();
65    let mut temp: ou64 = x;
66    loop {
67        match *temp {
68            None => unreachable!(),
69            Some(val) if val == 0 => break,
70            Some(_) => {
71                rev = (rev * 10) + (temp % 10);
72                temp = temp / 10;
73            }
74        }
75    }
76    return indeterminate_eq!(rev, x);
77}
78
79fn problem4() -> ou64 {
80    let mut maximum = ou64::from(0);
81    for i in 100..1000 {
82        for j in 100..1000 {
83            let prod: ou64 = ou64::from(i) * ou64::from(j);
84            match *prod {
85                None => return ou64::from(None),
86                Some(val) if palindrome(val) => {
87                    maximum = maximum.max(prod);
88                }
89                Some(_) => {}
90            }
91        }
92    }
93    return maximum;
94}
95
96fn problem6() -> oi64 {
97    let mut sum1: oi64 = 0.into();
98    let mut sum2: oi64 = 0.into();
99    for i in 1..101 {
100        sum1 = sum1 + oi64::from(i) * oi64::from(i);
101        sum2 = sum2 + i;
102    }
103    sum2 = sum2 * sum2;
104    return sum2 - sum1;
105}
106
107fn main() {
108    println!("problem1 {:?}", problem1());
109    println!("problem2 {:?}", problem2());
110    println!("problem3 {:?}", problem3());
111    println!("problem4 {:?}", problem4());
112    println!("problem6 {:?}", problem6());
113}