约数求一下,加起来就完事了
#include<stdio.h>
int n,t,ans;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
if(n==1) ans=0;
else ans=1;
for(int i=2;i<=n/i;i++) if(!(n%i)){
ans+=i;
if(n/i!=i) ans+=n/i;
}
if(ans-n) printf("%d is not perfect",n);
else printf("%d is perfect",n);
puts("");
}
return 0;
}
这真是个好方法
还是觉得这个最优雅
同问
请教一下这里的 n/i 是什么意思 ,为什么要这么写啊
i相当于一个约数,n/i相当于另外一个约数;
i逐渐增加,n/i逐渐减少,很显然当i>n/i时候会倒过来重新来一遍,是没必要的;单调性保证了正确性;
这样能降低很大的时间复杂度。
我居然忘了 1 谢谢大佬
特判1 使我豁然开朗
俺也一样
可以问一下为什么要特判1吗?1不是完全数不符合if也不会加入到·sum里面,后面的if也只会输出no啊