看着是打表题。开始写的打表的算法有点慢,跑1秒多才出来答案,就想把表直接列出来,结果超过提交限制了 = =。。
后来想起来筛法了,好多数论题都用类似筛法的方法了。把所有数都赋值为1,从2开始,2的倍数+=2.。。3的倍数+=3.。。
WA了一次,1的话应该是不算自身的,所以加和为0。。
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <queue>
#include <math.h>
#include <limits.h>
#define MAX 60010
using namespace std;
int out[MAX];
void init()
{
int i,j;
for(i=1; i<MAX; i++)
out[i] = 1;
out[1] = 0;
for(i=2; i<MAX; i++)
{
for(j=2; j*i<MAX; j++)
out[j*i] += i;
}
}
int main()
{
int n;
init();
printf("PERFECTION OUTPUT/n");
while( ~scanf("%d",&n) && n )
{
printf("%5d",n);
if( out[n] == n )
printf(" PERFECT/n");
else
if( out[n] > n )
printf(" ABUNDANT/n");
else
printf(" DEFICIENT/n");
}
printf("END OF OUTPUT");
return 0;
}