Perfect Numbers

1. Readme

完全数

根据 Nicomachus’(60-120CE)的自然数分类方案,确定一个数是- Perfect(完全), Abundant(过剩数), Deficient(亏数)

希腊数学家Nicomachus设计了一种自然数的分类方案,将每一个数识别归类为 perfect, abundant, or deficient ,方案基于aliquot sum(等值和)。 等值和定义为不包括数字本身的约数(可除出整数)的总和。例如,15 的等值和是(1+3+5)=9.

  • Perfect(完全): aliquot sum = number
    • 6 ,因为 (1 + 2 + 3) = 6
    • 28 ,因为 (1 + 2 + 4 + 7 + 14) = 28
  • Abundant(过剩数): aliquot sum > number
    • 12 , 因为 (1 + 2 + 3 + 4 + 6) = 16
    • 24 , 因为 (1 + 2 + 3 + 4 + 6 + 8 + 12) = 36
  • Deficient(亏数): aliquot sum < number
    • 8 , 因为 (1 + 2 + 4) = 7
    • 素数 都是 deficient

实现一种方法来确定给定的数字是否为Perfect。 根据您的语言轨迹,您还可能需要实现一种方法来确定给定的数字是否为AbundantDeficient.

资源

取自 Neal Ford 的函数思维第 2 章.http://shop.oreilly.com/product/0636920029687.do

2. 开始你的表演

#[derive(Debug, PartialEq, Eq)]
pub enum Classification {
   Abundant,
   Perfect,
   Deficient,
}

pub fn classify(num: u64) -> Option<Classification> {
   unimplemented!("classify {}", num);
}

3. 测试代码查看


# #![allow(unused_variables)]
#fn main() {
macro_rules! tests {
   ($property_test_func:ident {
       $( $(#[$attr:meta])* $test_name:ident( $( $param:expr ),* ); )+
   }) => {
       $(
           $(#[$attr])*
           #[test]
           fn $test_name() {
               $property_test_func($( $param ),* )
           }
       )+
   }
}

fn test_classification(num: u64, result: Classification) {
   assert_eq!(classify(num), Some(result));
}

#[test]
fn basic() {
   assert_eq!(classify(0), None);
}

tests! {
   test_classification {
       test_1(1, Classification::Deficient);
       test_2(2, Classification::Deficient);
       test_4(4, Classification::Deficient);
       test_6(6, Classification::Perfect);
       test_12(12, Classification::Abundant);
       test_28(28, Classification::Perfect);
       test_30(30, Classification::Abundant);
       test_32(32, Classification::Deficient);
       test_33550335(33550335, Classification::Abundant);
       test_33550336(33550336, Classification::Perfect);
       test_33550337(33550337, Classification::Deficient);
   }
}

#}

4. 答案


# #![allow(unused_variables)]
#fn main() {
pub fn classify(num: u64) -> Option<Classification> {
   if num == 0 {
       return None;
   }
   let sum: u64 = (1..num).filter(|i| num % i == 0).sum();
   if sum == num {
       Some(Classification::Perfect)
   } else if sum < num {
       Some(Classification::Deficient)
   } else {
       Some(Classification::Abundant)
   }
}

#[derive(Debug, PartialEq, Eq)]
pub enum Classification {
   Abundant,
   Perfect,
   Deficient,
}

#}



填充/相关