方法1(网友告知)
int main()
{
int m, n;
scanf("%d%d", &m, &n);
int i,j,k,t;
int num[100];//存储分解出来的乘数
int flag = 0;
for (i = m; i <= n;i++)//大循环
{
int sum = 0;//判断乘数的和
k = 0;//数组下标,要重置
for (j = 1; j < i; j++)
{
if(i%j==0)
{
num[k] = j;
k++;//下标自增
sum += j;
}
}
if(sum==i)//是完数
{
flag = 1;//标记存在完数
num[k] = '\0';
printf("%d = %d", sum, num[0]);
for (t = 1; num[t] != '\0'; t++)
{
printf(" + %d", num[t]);
}
printf("\n");
}
}
if(flag==0)
{
printf("None\n");
}
return 0;
}
方法2
#include<stdio.h>
int judge(int m)
{
int i, a = 0;
for (i = 1; i < m; i++)
{
if (m % i == 0)
{
a = a + i;
}
}
if (a == m)
return 1;
else
return 0;
}
int main()
{
int n, m,j,b=0;
scanf("%d %d", &m, &n);
for(m;m<=n;m++)
{
if(judge(m))
{
printf("%d = 1", m);
for(j=2;j<=m;j++)
{
if(m%j==0)
{
printf("+ %d", j);
}
}
printf("\n");
b++;
}
}
}
简化版
int main()
{
int N;
int n;
int i;
int sum;
scanf("%d", &N);
for (n = 1; n <= N; n++)
{
sum = 0;//每次都必须初始化
for (i = 1; i < n; i++)
{
if (n%i == 0)
sum += i;//因子加和
}
if (n == sum)
{
printf("%d=1", n);
for (i = 2; i < n; i++)//输出因子
{
if (n%i == 0)
printf("+%d ", i);
}
printf("\n");
}
}
return 0;
}