说明:一个数如果有因数的话,那么因数是成对出现,其中一个小于该数的平方根,另一个大于该数的平方根。
#include <stdio.h>
#define NUM 10000
/* 完数:它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
* 问题:求10000以内的所有完数 */
//求完数
void f(int x);
int main()
{
for (int i=2;i<NUM;i++)
{
f(i);
}
return 0;
}
void f(int x)
{
int arr[100] = {1};
int k = 1,sum = 0;
for (int i=2;i*i<=x;i++) // i*i<=x可提高运算速率
{
if(x%i == 0)
{
arr[k++] = i;
arr[k++] = x / i;
}//分解因数
}
//求和
for (int j=0;j<k;j++)
{
sum += arr[j];
}
if (sum == x)
{
printf("%d = ",x);
//冒泡排序
for (int i=0;i<k;i++)
{
for (int j=i;j<k;j++)
{
if (arr[i]>arr[j])
{
int mid;
mid = arr[i];
arr[i] = arr[j];
arr[j] = mid;
}
}
}
for (int m=0;m<k;m++)
{
printf("%8d",arr[m]);
}
puts("\n");
}
}