Grains
1. Readme
谷物
计算棋盘上的小麦粒数,假设每个方格的数量增加一倍.
曾经有一位睿智的仆人拯救了王子的生命。国王承诺支付仆人梦寐以求的一切。知道国王喜欢国际象棋,仆人告诉国王他想吃小麦粒,在棋盘的第一个正方形上放一粒小麦。而接下来的方格是两粒.四粒小麦放在第三格,依此类推.
棋盘上有 64 个方格.
编写代码,用来显示:
- 每个方格上有多少谷物,和
- 谷物总数
加分
你是否通过了测试,并且代码干净了? 如果您愿意,可以尝试以下一些额外的事情:
- 优化速度.
- 优化可读性.
那么请在提交的评论中分享您的想法.这个实验是否使代码更好? 更差? 你从中学到了什么吗?
资源
JavaRanch Cattle 驱动,练习 6 http://www.javaranch.com/grains.jsp
2. 开始你的表演
pub fn square(s: u32) -> u64 { unimplemented!("grains of rice on square {}", s); } pub fn total() -> u64 { unimplemented!(); }
3. 测试代码查看
# #![allow(unused_variables)] #fn main() { #[test] fn square_one() { assert_eq!(square(1), 1); } #[test] //#[ignore] fn square_two() { assert_eq!(square(2), 2); } #[test] //#[ignore] fn square_three() { assert_eq!(square(3), 4); } #[test] //#[ignore] fn square_four() { assert_eq!(square(4), 8); } #[test] //#[ignore] fn square_sixteen() { assert_eq!(square(16), 32_768); } #[test] //#[ignore] fn square_thirty_two() { assert_eq!(square(32), 2_147_483_648); } #[test] //#[ignore] fn square_sixty_four() { assert_eq!(square(64), 9_223_372_036_854_775_808); } #[test] //#[ignore] #[should_panic(expected = "Square must be between 1 and 64")] fn square_zero_panics() { square(0); } #[test] //#[ignore] #[should_panic(expected = "Square must be between 1 and 64")] fn square_sixty_five_panics() { square(65); } #[test] //#[ignore] fn total_sums_all_squares() { assert_eq!(total(), 18_446_744_073_709_551_615); } #}
4. 答案
# #![allow(unused_variables)] #fn main() { pub fn square(s: u32) -> u64 { if s == 0 || s > 64 { panic!("Square must be between 1 and 64"); } 2u64.pow(s - 1) } pub fn total() -> u64 { (1..65).fold(0, |acc, s| acc + square(s)) } #}