#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,x;
cin>>n;
int s;
int sum;
while(n--)
{
cin>>x;
sum=0;
if(x==1)
cout<<x<<" is not perfect"<<endl;
else
{
for(int i=1;i<=sqrt(x);i++)
if(x%i==0)
{
sum+=i;
s=x/i;
//printf("%d %d\n",i,s);
sum+=s;
}
//printf("%d\n",sum);
if(sum/2==x)
cout<<x<<" is perfect"<<endl;
else
cout<<x<<" is not perfect"<<endl;
}
}
return 0;
}
因为因数是成对存在的,所以可以对x进行开方,求出前一半的因数,那后一半的可以用x求出来,前一半中包含1,那么后一半中就包含他本,所以sum求完以后要减去它本身,这样在与x进行比较.这样写的好处是不会超时.
为什么开平方呢?假设不重复的话一个i能被x个数约去,那他应该有2x个约数啊,为什么是x^2个约数呢?求解
不错 ,明白了
谢谢( • ̀ω•́ )✧
谢谢楼主的方法,看了好几种,只有楼主的方法看懂了什么意思!!!!