题目要求:
如果一个数恰好等于它的因子之和,那么这个数就被称为完全数。例如6的因子为1,2,3,而6=1 2 3,因此6是一个完全数。求出1000以内的完全数。
题目分析:
本题最为直接的解法就是利用穷举法在1~1000以内判断每个数是否是完全数,如果是完全数就输出之。问题的关键就是如何判断一个数a是否是完全数。它要分为两个步骤完成:
(1)求出a的所有因子a1,a2…an的和sum;
(2)判断a1 a2 … an的和sum是否等于a,如果sum等于a则a是完全数,否则a不是完全数。
#include"stdio.h"
#define max 100
Perm(int a[], int n ,int s ,int r[], int m){
int i,j,k,flag=0;
int b[max]; /*数组b存放子序列*/
for(i=0;i<n;i ){
flag = 1;
r[s] = a[i]; /*复制数列a中第i个元素到数组r*/
j = 0;
for(k=0;k<n;k ) /*产生子序列b*/
if(i != k){
b[j] = a[k];
j ;
}
Perm(b,n-1,s 1,r,m); /*全排列子序列b*/
}
if(flag == 0){ /*得到一种排列结果*/
printf("\n");
for(k=0;k<m;k )
printf("%d",r[k]); /*输出存放排列结果的数组r中的内容*/
printf("\n");
}
}
main()
{
int a[max] , r[max];
int i,n;
printf("Please input the number of digit inthe array\n");
scanf("%d",&n); /*输入待排列的数列中元素的个数*/
printf("Please input a string for array\n");
for(i=0;i<n;i ) /*输入数列中的元素(整数)*/
scanf("%d",&a[i]);
Perm(a,n,0,r,n); /*全排列操作*/
getche();
运行结果: