資料結構與演算法一

來源:互聯網
上載者:User

標籤:style   class   blog   code   http   ext   

題目一:求1!+2!+…..+n! 的和的後6位,(注意n的範圍)

#include <iostream>using namespace std;const int MAX = 1000000;int getResu(int n){int sum=0;int temp= 1;for(int i=1; i <= n; i++){temp *= i;temp %= MAX;sum += temp;sum %= MAX;}return sum ;}int main(){int n;while(cin>>n){if(n > 0)cout << getResu(n) << endl;elsecout << "Please input a integer greater than zero !" <<endl;}return 0;}

題目二:一個長度為N 的序列中,求最大值和最小值並輸出。最後分析可能存在的最佳化性。

#include <iostream>#include <cstdlib>// 設定隨機函數#include <ctime>using namespace std;const int MAX_COUNT = 10000;const int MAX_VALUE = 1000;int number[MAX_COUNT];void init(){  //0-1000for(int i=1; i <= MAX_COUNT; i++)number[i] = rand()%MAX_VALUE;for(int i=1; i <= MAX_COUNT; i++)cout << number[i] << " ";cout << endl;}void solve(){int max, min, flag;if((flag=MAX_COUNT%2))// 假設為真,1max=min=number[1];else{// 為偶數的情況if(number[1]>number[2]){max = number[1];min = number[2];}else{max = number[2];min = number[1];}}if(flag) flag = 2;else flag = 3;for(int i=flag; i < MAX_COUNT; i+=2){if(number[i]>number[i+1]){if(number[i] > max)max = number[i];if(number[i+1] < min)min = number[i+1];}else{if(number[i+1] > max)max = number[i+1];if(number[i] < min)min = number[i];}}cout << "MAX = " << max << endl;cout << "MIN = " << min << endl;}int main(){  //隨機函數的種子srand(time(NULL));init();// 初始化solve();// 解決return 0;}


在N個數中找出最大最小值的方法是顯然的,僅僅要分別獨立地找出最小值和最大值,這各須要n-1 比較,假定第一個最大最小共需2n-2比較。其實,僅僅須要最多3(n/2)次比較就能夠。詳細的方法是記錄已知的最大最小值,但並非將每個輸入元素與當前的最大最小值進行比較-----由於這樣做的代價是每個元素須要2次比較。每個元素和最大比較一次。最小值一次。而是對輸入的元素進行成對照較。首先,對輸入的一對元素進行相互比較,然後把較小的值與當前的最小值進行比較,把較大的值與當前最大值進行比較。這樣對每兩個元素共須要三次的比較,少於上述的4次比較。怎樣設定已知的最小值和最大值的初始值依賴於n 是奇數還是偶數。假設n 是奇數,我們就將最小值和最大值
設為第一個數的值。假設n 是偶數,那麼就將第一個數和第二個數做比較,較小的值就是當前的最小值較大的值就是當前的最大值,接下來的數就成對的比較,取較小和當前最小比,取較大和當前最大比。最後來分析一下總的比較次數,假設n 是奇數,那麼總共進行3(n/2)次比較,假設n 是偶數,則是 3(n-2)/2+1 次比較,至多是3(n/2)。

題目三:排列問題


參考我的還有一篇部落格:http://blog.csdn.net/china_zoujinyong/article/details/17588897


題目四:台階問題

問題描寫敘述:我們學校北區食堂一樓到二樓的樓梯一共同擁有17個台階,正常人的你一次能夠選擇邁1個台階,2個台階,或3個台階,問你從最底下走上17個台階,一共同擁有多少種走法?


解法一:

上n個台階的方法等於上n-1個台階和n-2個台階和n-3個台階的方法之和

台階數 方法 步驟

  1.         11

  2. 22 1+1

  3. 43 1+2 1+1+1 2+1

  4. 71+3 1+2+1 1+1+1+1 1+1+2 2+1+1 2+2 3+1

  5. 131+1+1+1+1 1+2+2 2 +1+2 1+2+1 1+1+3 3+1+1 1+3+1

1+2+1+1 1+1+2+1 2+1+1+1 1+1+1+2 2+3 3+2

6 24 1+1+1+1+1+1 2+1+1+1+1 (5種) 3+1+1+1 (4種)

2+2+1+1(6種)2+3+1(6種)3+3 2+2+2  




#include <iostream>using namespace std;int recu(int n){  if(n==1) return 1;  if(n==2) return 2;  if(n==3) return 4;  return recu(n-1)+recu(n-2)+recu(n-3);}int main(){  int n;  cin >> n;  cout << recu(n) << endl;  return 0;}


方法二:設定一個容器,往裡面放東西(1,2,3,),假設容器裡面數的值等於給定的n 的值的大小,那麼滿足條件,作為一次結果儲存起來。


#include <iostream>using namespace std;int n, resu=0;int number[3]={1,2,3};void recu(int count){  if(count==n)    {      resu++;      return ;    }  if(count > n)    return ;  for(int i=0; i < 3; i++)    {      count += number[i];      recu(count);      count -= number[i];    }}int main(){  cin >> n;  recu(0);  cout << resu << endl;  return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.