注:该题的难点在按要求输出格式
输入样例:
2 30
输出样例 :
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
用占位符替代空格可以看到:
测试结果有以下几种情况:
问题分析:
1.第一层循环:遍历从m到n的数,逐个判断是不是完数
2.从1开始到num-1,找出因数并存在数组里
3.判断是不是完数
4.按题目要求输出
完整代码如下:
#include <stdio.h>
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++)//从1开始,不能等于数本身
{
if(i%j==0)
{
num[k] = j;
k++;//下标自增
sum += j;
}
}
if(sum==i)//是完数
{
flag = 1;//标记存在完数
num[k] = '\0';//k的值偏大,给数组赋个结束标记,不能省略
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");//响应上面的flag
}
return 0;
}
运行结果如下:
希望我的代码对你有帮助。