AcWing 725. 完全数
原题链接
中等
/*判断完全数*/
#include<iostream>
using namespace std;
int main(){
int n,x,sum;
cin >> n;
while(n--){ //循环n次
cin >> x;
sum=1;
if(x==1) cout << x << " is not perfect";
else{
for(int i=2;i*i<=x;i++){
if(x%i==0 && i!=x/i) sum+=i+x/i;
if(x%i==0 && i==x/i) sum+=i;
}
if(sum==x) cout << x << " is perfect";
else cout << x << " is not perfect";
}
cout << endl;
}
}
/*
一)代码主体执行步骤:
1)
记x的约数为i,if x能整除i→x一定能整除x/i
∵i从2开始增大
∴i≤x/i →i平方≤x
//代码↓
for(xxx;i*i<=x;++i)
2)
if x能整除i→sum+i+x/i (if x是完全平方i=x/i→sum+i)
//代码↓
if(x%i==0 && i!=x/i) sum+=i+x/i;
if(x%i==0 && i==x/i) sum+=i;
二)细节:
完全数:一个数=除本身以外的所有约数和
除本身以外↓
对于输入的每个数x,从2开始判断能否被x整除(!!不是从1开始)
for(int i=1;i*i<=x;++i){
if(x%i==0 && i!=x/i) sum+=i+x/i;
}
∵i=1 →sum=1+本身
∴sum初始值=1,i从2开始
→特殊情况x=1
∵1除本身外无约数→1不是完全数
又∵不执行for循环→sum=1,x=1→sum==x输出1是完全数
∴if语句→把x=1和x=other分开
if(x==1) cout << x << " is not perfect";
else{
}
*/