《算法零基础100讲》(第9讲) 算术基本定理

举报
英雄哪里出来 发表于 2021/11/28 07:49:18 2021/11/28
【摘要】 算术基本定理

零、写在前面

  这是《算法零基础100讲》 专栏打卡学习的第九天了,如果能坚持到现在的同学,基本很大程度上可以坚持到最后了,这是 沉没成本 决定的。所以,首先恭喜看到这句话的你。

一、概念定义

  算术基本定理可以描述为:对于每个整数 n n ,都可以唯一分解成素数的乘积,如下:

n = p 1 p 2 p 3 . . . p k ( p 1 p 2 p 3 . . . p k ) n = p_1p_2p_3...p_k \\ (p_1 \le p_2 \le p_3 \le ... \le p_k)

  这里的素数并不要求是不一样的,所以可以将相同的素数进行合并,采用素数幂的乘积进行表示,如下:

n = p 1 e 1 p 2 e 2 p 3 e 3 . . . p k e k ( p 1 < p 2 < p 3 < . . . < p k ,   e i > 0 ) n = p_1^{e_1}p_2^{e_2}p_3^{e_3}...p_k^{e_k} \\ (p_1 \lt p_2 \lt p_3 \lt ... \lt p_k , \ e_i > 0)

二、题目描述

  对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「 完美数 」。给定一个 整数 n ( n 1 0 8 ) n (n \le 10^8) , 如果是完美数,返回true,否则返回false

三、算法详解

  要求正因子之和,我们可以把所有不包含自身因子都枚举出来,然后加和,再来和自身作比较。对于一个数 n n ,如果有一个因子 t t ,那么必然 n n 能被 t t 整除,同样 n n 能被 n / t n/t 整除,那么无论 t t n / t n/t 哪个大,都可以推导出:$$t \le \sqrt n$$,所以我们可以枚举所有满足条件的 t t ,然后加和所有满足条件的 t t n / t n/t 从而得出所有因子的和。

四、源码剖析

bool checkPerfectNumber(int num){
    int i, sum = 0;
    if(num == 1) {
        return false;               // (1)
    }
    for(i = 1; i*i <= num; ++i) {    // (2)
        if(num % i == 0) {           // (3)
            sum += i;
            if(i*i != num)
                sum += num / i;
        }
    }
    sum -= num;                     // (4)
    return sum == num;
}
  • ( 1 ) (1) 1 的情况需要特殊判断;
  • ( 2 ) (2) 只需要枚举小于等于 n u m \sqrt{num} 那部分因子;
  • ( 3 ) (3) 找到因子 i i n u m / i num/i ,并且累加;
  • ( 4 ) (4) 根据题意,减去本身;

五、推荐专栏

💜《夜深人静写算法》💜
三)初等数论入门

六、习题练习

请参考原文

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。