《算法零基础100讲》(第9讲) 算术基本定理
【摘要】 算术基本定理
零、写在前面
这是《算法零基础100讲》 专栏打卡学习的第九天了,如果能坚持到现在的同学,基本很大程度上可以坚持到最后了,这是 沉没成本 决定的。所以,首先恭喜看到这句话的你。
一、概念定义
算术基本定理可以描述为:对于每个整数 ,都可以唯一分解成素数的乘积,如下:
这里的素数并不要求是不一样的,所以可以将相同的素数进行合并,采用素数幂的乘积进行表示,如下:
二、题目描述
对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「 完美数 」。给定一个 整数 , 如果是完美数,返回
true
,否则返回false
。
三、算法详解
要求正因子之和,我们可以把所有不包含自身因子都枚举出来,然后加和,再来和自身作比较。对于一个数 ,如果有一个因子 ,那么必然 能被 整除,同样 能被 整除,那么无论 和 哪个大,都可以推导出:$$t \le \sqrt n$$,所以我们可以枚举所有满足条件的 ,然后加和所有满足条件的 和 从而得出所有因子的和。
四、源码剖析
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 的情况需要特殊判断;
- 只需要枚举小于等于 那部分因子;
- 找到因子 和 ,并且累加;
- 根据题意,减去本身;
五、推荐专栏
六、习题练习
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)