问题:输出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小时内删除。