题目描述
输入
输出
样例输入
样例输出
数据范围限制
思路
由于 N < = 100000 N<=100000 N<=100000,所以暴力即可。在取因数的时候,可以分成基础的因数,再用 N N N除以TA求另一个因数
当然其实
100000
100000
100000以内只有
6
,
28
,
496
,
8128
6,28,496,8128
6,28,496,8128四个完全数 (打表是个好东西)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int Gun,ans[100000],num,ans1[100000],num1;
//ans是基础的因数,ans1是“顺便”求的因数
int main(){
//freopen("perfect.in","r",stdin);
//freopen("perfect.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(x==1){//特判一下1
printf("Not perfect.\n");
continue;
}
for(int j=1;j*j<=x;j++){//循环到开方
if(x%j!=0)continue;
Gun+=j,ans[++num]=j;
if(x/j!=j&&x/j<x)//求另一个因数
Gun+=x/j,ans1[++num1]=x/j;
}
if(Gun==x){
printf("%d=%d",x,ans[1]);
for(int j=2;j<=num;j++)
printf("+%d",ans[j]);
for(int j=num1;j>0;j--)
printf("+%d",ans1[j]);
printf("\n");
}else printf("Not perfect.\n");
Gun=num=num1=0;
}
}