问题:输出1000以内所有的完数,并输出其所有的因子。完数的定义如下:一个数的所有因子(除其自身)之和恰好等于其自身。
分析:问题的关键为求解一个数的所有因子,并求其和。假设当前的数m,计算其因子的过程,为遍历从1到 m-1所有的数,并判定是否可以整除m。
数据要求
问题中的常量:
#define N 1000 /*完数求解范围*/
问题的输入:
无
问题的输出:
int i /*当前完数*/
int j /*当前完数的因子*/
初始算法
1.因子和初始化为0
2.遍历当前整数的因子并计算因子和
3.判断是否完数
4.输出完数及其因子
算法细化
步骤2遍历当前整数的因子并计算因子和的细化:
并输出计算整数m所有因子之和的过程如下:
sum=0;
for(j=1;j<m;j++)
{
if(m%j==0) /*j为m 的因子*/
sum=sum+j;
}
又根据一个数除本身以外的所有因数都小于或等于这个数的一半,可以对上述循环进一步处理,减少循环次数。
sum=0;
for(j=1;j<=m/2;j++)
{
if(m%j==0) /*j为m 的因子*/
sum=sum+j;
}
流程图
程序代码如下:
#include "stdio.h"
#include "math.h"
#define N 1000 /*完数求解范围*/
void main()
{
unsigned int i,j,sum;
for(i=1;i<N;i++)
{
sum=0;
for(j=1;j<=i/2;j++)
{
if(i%j==0)
sum=sum+j;
}
if(sum==i)
{
printf("\n%5d\n",i);
for(j=1;j<=i/2;j++)
{
if(i%j==0)
printf("%5d",j);
}
}
}
}
程序运行结果如下:
6
1 2 3
28
1 2 4 7 14
496
1 2 4 8 16 31 62 124 248
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论