因子和可以參考這裏,雖然這道題數據很弱,可以暴力過。但是可以用來練習。注意輸入爲1時的情況。
暴力法
#include <cstdio>
int proc(int n){
int s = 1;
for(int i=2;i<n;++i){
if ( 0 == n % i ) s += i;
}
return s;
}
int main(){
printf("PERFECTION OUTPUT\n");
int n;
while(scanf("%d",&n)&&n){
printf("%5d ",n);
int s = proc(n);
if( 1 == n || s < n ) printf("DEFICIENT\n");
else if( s == n ) printf("PERFECT\n");
else printf("ABUNDANT\n");
}
printf("END OF OUTPUT\n");
return 0;
}
因子和公式
#include <cstdio>
int power(int a,int n){
int r = 1;
while(n){
if ( n & 1 ) r *= a, --n;
n>>= 1;
a *= a;
}
return r;
}
int proc(int n){
int nn = n;
int s = 1;
for(int i=2;i*i<=n;++i){
if ( n % i ) continue;
int k = 0;
while( 0 == n % i ) n /= i, ++k;
s *= ( power(i,k+1) - 1 ) / ( i - 1 );
}
if ( n != 1 ) s *= ( 1 + n );
return s - nn;
}
int main(){
printf("PERFECTION OUTPUT\n");
int n;
while(scanf("%d",&n)&&n){
printf("%5d ",n);
int s = proc(n);
if( 1 == n || s < n ) printf("DEFICIENT\n");
else if( s == n ) printf("PERFECT\n");
else printf("ABUNDANT\n");
}
printf("END OF OUTPUT\n");
return 0;
}
還可以試試篩法求質數,再求質因子。