簡述:ios
「自頂向下」的算法設計,就是先概要地設計算法的第一層(頂層),而後步步深刻,逐層細分,逐步細分,逐步求精,直到整個問題可用程序設計語言明確的描述出來爲止。算法
設計步驟:數組
1.首先對問題進行仔細分析,寫出程序的主要過程和任務。 2.把大問題分解爲幾個子問題。 3.處理子問題,造成單獨的模塊。
【例題】:一個數若是剛好等於它的因子之和(包括1,但不包括這個數自己),這個數就稱爲「完數」。求1000之內的「完數」,並按要求輸出。cors
- 例如:28的因子爲1,2,4,7,14,且28 = 1 + 2 + 4 + 7 + 14,則28是「完數」。
- 輸出格式:
28 it's factors are 1,2,4,7,14
問題分析:模塊化
因數的定義:整數a除以整數b(b≠0) 的商正好是整數而沒有餘數,咱們就說b是a的因數(這題有要求不能去自己)。第一步經過問題可知判斷一個數是否是「完數」,如果完數則按格式輸出。第二部怎麼判斷是否是完數?則可知要因子相加等於其自己。函數
自頂向下算法設計:spa
- 頂層算法
for(i = 2; i <= n; i++) { if(i是完數) { 按格式輸出; } }
- 判斷i是否爲完數的算法-----------分解模塊1
bool isPerfect(int n, int &flag, int a[]) //判斷是否爲完數的方法 { int s = 1; for(int i = 2; i < n; i++) if(n%i == 0) //判斷i是否爲i的因子 { s += i; //求因子之和 a[flag++] = i; //存儲n的因子,爲輸出算法提供條件 } if(s == n) //判斷因子是否與n自己相等 return true; return false; }
- 輸出算法----------------------------分解模塊二
void print(int i,int a[], int flag) //輸出函數---------模塊二 { cout << i << " it's facors are: 1"; for(int i = 0; i < flag; i++) //循環打印完數的因子 cout << "," << a[i]; cout << "\n"; }
- 在主函數中調用算法模塊
int main() { int a[1000]; //定義數組a存儲因子 for(int i = 2; i <= 1000; i++) { int flag = 0; //初始化數組下標 if(isPerfect(i, flag, a)) //調用模塊一,判斷i是否爲完數 print(i,a,flag); //調用模塊二,打印輸出 } return 0; }
s-code:設計
#include<iostream> using namespace std; bool isPerfect(int n, int &flag, int a[]) //判斷是否爲完數的方法------模塊一 { int s = 1; for(int i = 2; i < n; i++) if(n%i == 0) //判斷i是否爲i的因子 { s += i; //求因子之和 a[flag++] = i; //存儲n的因子,爲輸出算法提供條件 } if(s == n) //判斷因子是否與n自己相等 return true; return false; } void print(int i,int a[], int flag) //輸出函數---------模塊二 { cout << i << " it's facors are: 1"; for(int i = 0; i < flag; i++) //循環打印完數的因子 cout << "," << a[i]; cout << "\n"; } int main() { int a[1000]; //定義數組a存儲因子 for(int i = 2; i <= 1000; i++) { int flag = 0; //初始化數組下標 if(isPerfect(i, flag, a)) //調用模塊一,判斷i是否爲完數 print(i,a,flag); //調用模塊二,打印輸出 } return 0; }
output:3d
總結:code
自頂向下設計的特色:先總體後局部,先抽象後具體(培養模塊化思想)。。。。。。。。