自顶向下:从全局走向局部,特别适合有嵌套循环的时候。
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]);
}
}