算法笔记_day1_自顶向下(循环)

自顶向下:从全局走向局部,特别适合有嵌套循环的时候。

ey:一个数如果恰好等于它的因子之和,(包括1,但不包括他本身);这个数就称为完数。

  例如:28的因子是:1,2,4,7,14;28=1+2+4+7+14;那么28就是一个完数。

  求:1000以内的完数,并输出每个完数的因子(从小到大输出);

分析:这个问题变成球一个数的因子,并且每个因子只被记录一次,用数组a[]来记录,然后就求和,判断是否是完数,是,输出a[];

自顶向下设计:就是先设计顶层,然后步步深入,逐层细分,逐步求精,直到整个问题可以用程序设计语言表述出来。

本题的设计过程如下:

1.顶层设计:

  for(i=2;i<=n;i++)

  {

    A.判断i是否是完数;

    B.是完数就按要求输出;

  }

2. A 判断i是否是完数的算法

  for(j=2;j<i;j++)

  {

    C.找i的因子,并累加;判断相等i;

    D.如果累加值等于i,是完数就走B

  }

3.C 找i的因子并求累加值:

  int s=1;

  for(j=2;j<i/2;j++)

  {

    //不包括本身,最大因子不会超过本身的一半。

    if(j%i==0)  s=s+j;

  }

D if(s==i)    B;

4.B考虑输出,

  应该开辟数组存储数据i的所以因子,并记录其因子的个数;

  int a[],k;

  for(j=2;j<i;j++)

    if(j%i==0)

    {s=s+j;a[k]=j;k++}

  if(s==i)

  {for(j=0;j<k;j++) print(a[i]);}

完整代码:

  int i,j,k;

  int s,a[20];

  for(i=1;i<=1000;i++)

  {

    s=1;

    k=0;

    //A

    for(j=2;j<i/2;j++)

    {  

      if(j%i==0)

      {s=s+j;a[k]=j;k++}

    }

    if(s==i)

    {

      print(1);//循环是从2开始的。

      for(j=0;j<k;j++)

        print(a[k]);

    }

  }

原文地址:https://www.cnblogs.com/wust221/p/3033902.html