C++ 完全数的判断(证明完全平方数不可能是完全数)

C++ 完全数的判断

对于自然数\(n\),其除了自身以外的所有因数的和,等于其自身的,称\(n\)为完全数。在C++中可以通过遍历\(1\)\(n\)找出所有因数,然后求和验证。但\(n\)次遍历往往无法满足时间复杂度的要求。

注意到,对自然数\(n\),假设其存在因数\(a\),则必存在因数\(b = n / a\),且\(min(a, b)\)不大于\(\sqrt(n)\)。利用这条性质可以将原本需要的n次遍历减少为\(\sqrt(n)\)次遍历。


int n, sum = 1;

cin >> n; // n为输入的自然数n

for (int i = 2; i <= n / i; i ++ ){

if (n % i == 0){

sum += (i + n / i);

}

}

一般的代码中都没有考虑\(i = n / i\)的情况,即\(n\)为完全平方数的情况。如何证明完全平方数不可能是完全数?

证明:完全平方数不可能是完全数

对大于3的正整数\(n\),其除了自身的约数的和\(sum(n)\)有:

\[sum(n) < n(n+1)/2 - n = (n^2-n)/2
\]

对于一个完全平方数$ k = n * n \(,如果其为完全数,则\) n \(的约数和\)sum(n) = k - n = n^2 - n$,显然不可能。所以完全平方数不需要特别处理。

C++ 程序

#include <iostream>
#include <cmath>
using namespace std;

int main(){
int n;
cin >> n;

while(n--){
int x, sum = 1;
cin >> x;
for (int i = 2; i < sqrt(x); i ++){
if (x % i == 0){
sum += i;
sum += x / i;
}
}

if (x != sum || x == 1)
printf("%d is not perfect\n", x);
else
printf("%d is perfect\n", x);
}

return 0;
}

原文链接: https://www.cnblogs.com/kerwindeng/p/15013426.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++ 完全数的判断(证明完全平方数不可能是完全数)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/212196

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午1:10
下一篇 2023年2月13日 上午1:11

相关推荐