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。 根据您的语言轨迹,您还可能需要实现一种方法来确定给定的数字是否为Abundant或Deficient.
资源
取自 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, } #}