完全数
一个整数,除了本身以外的其他所有约数的和如果等于该数,那么我们就称这个整数为完全数。
例如,6就是一个完全数,因为它的除了本身以外的其他约数的和为 1+2+3 = 6。
现在,给定你N个整数,请你依次判断这些数是否是完全数。
输入格式
第一行包含整数N,表示共有N个测试用例。
接下来N行,每行包含一个需要你进行判断的整数X。
输出格式
每个测试用例输出一个结果,每个结果占一行。
如果测试数据是完全数,则输出“X is perfect”,其中X是测试数据。
如果测试数据不是完全数,则输出“X is not perfect”,其中X是测试数据。
#include <iostream>
#include <string>
using namespace std;
string prefect(int a){
int sum = 0;
//for(int i = 1 ; i < a ; i++){
if( a == 1 ) sum = 0; //注意特殊情况
/*
for(int i = 2 ;i <= a; i++){
if(a%i == 0) sum += i;
} //这样写超时了,必须想办法减小复杂度
*/
else sum = 1;
for(int i = 2 ; i <= a/i ; i++)
//在一个for循环中进行两次判断,因为一个数的约数是成对出现的
if( !(a%i) ){ //如果 i 是 a 的约数
sum += i; //累计到 sum 里面
if(a/i != i) //如果 a/i 是约数(与 i 成对)
sum += a/i;
}
if(sum == a) return "is perfect";
else return "is not perfect";
}
int main(){
int n,a;
cin>>n;
for(int i = 0 ; i < n ; i++){
cin>>a;
cout<<a<<" "<<prefect(a)<<endl;
}
return 0;
}