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))
}

#}



填充/相关