1.这道题一开始我TLE。
2.我学了一种新方法,这种方法能减少循坏次数。方法是:j*j<=m。
3.【1】这个数不是完全数,需要特判,但我一开始没想到。
4.优化减少循坏次数后,只加了部分约数,与之对应的约数m/j忘记加了。同时我还把这个数本身当做约数加上了,解决办法是:把约数1单独处理,sum初始值设为1就解决了,for循坏从2开始。
#include<iostream>
using namespace std;
int main()
{
//freopen("xxx.in","r",stdin);
//freopen("yyy.out","w",stdout);
int n,sum=1,m;
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> m;
if(m==1)
cout << m << " is not perfect" << endl;
else
{
for(int j=2;j*j<=m;j++)
{
if(m%j==0)
{
sum+=j;
sum+=m/j;
}
}
if(sum==m)
cout << m << " is perfect" << endl;
else
cout << m << " is not perfect" << endl;
sum=1;
}
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
有意思吗,两个号