1. 程式人生 > >演算法分析 演算法設計基礎

演算法分析 演算法設計基礎

實驗一 演算法設計基礎

 

一.實驗目的

理解蠻力法的思想及程式的執行過程;

理解遞推演算法的思想;

能較熟練地編寫列舉、遞推程式,對給定的問題能設計出相應演算法予以解決。

 

二.實驗基本步驟

1. 選定實驗題目,仔細閱讀實驗要求,設計好輸入輸出,按照分治法的思想構思演算法,選取合適的儲存結構實現應用的操作。

2. 設計的結果應在Visual C++ 實驗環境下實現並進行除錯。(也可使用JAVA程式設計)

3. 實驗要有詳細的測試記錄,包括各種可能的測試資料。

 

三. 實驗內容

1. 程式設計求和:s=a+aa+aaa+aaaa+ „„+aaaa„aaa(n個),其中a為1~9中的一個數字。 提示:若第一項為a , 以後每一項由前一項乘以10加上a遞推得到,然後求和。

#include<stdio.h>

#include<math.h>

void main()

{

int a,i;

long s=0,x=0;

int n;

   printf("輸入1~9其中一個數字\n");

   scanf("%d",&a);

   printf("輸入n\n");

   scanf("%d",&n);

   for(i=0;i<n;i++){

      x+=a*pow(10,i);

      s+=x;

      printf("%d",x);

      if(i!=(n-1))

        printf("+");

   }

    printf("=%ld\n",s);

 

}

2. 編寫程式求500 以內的勾股弦數,即滿足 c2=b2+a2的3個數,要求b>a。將所有符合要求的組合存入文字檔案中,每個組合佔一行。

 

#include<stdio.h>

#define N 500

#include<math.h>

int main()

{

int a,b,c;

FILE *fpt;

fpt = fopen("D:\\gougushu.txt","w");

for(a=3;a<=N;a++)

       for(b=4;b<=N;b++)

          for(c=5;c<=N;c++)

            if(a+b>c)

              if(c*c==b*b+a*a)

                 {

                  fprintf(fpt,"%d %d %d\n",a,b,c);

                 }

fclose(fpt);

}

}

3. 在教材3.4節中兩個問題(最近對問題、凸包問題)中任意選擇一個問題,程式設計實現用蠻力法求解。 具體演算法參考教材40-42頁。

 

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

#include<time.h>

#define N 10

void haha(int P[][2],int n)

{    

        int i,j;

      srand((unsigned)time(0));

      for(i=0;i<n;i++){

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

            P[i][j]=rand()%20;

}      

}

 

double ClosestPoints(int P[][2],int n)

{

    double min=12345678910;

      double dis=0;

   

      int i,j;

      int x,y;

      for(i=0;i<=n-2;i++){

         for(j=i+1;j<n-1;j++){

            dis=pow((P[j][0]-P[i][0]),2)+pow((P[j][1]-P[i][1]),2);

              if(dis<min){

                min=dis;

                  x=j;

                  y=i;

              }

         }

      }

      printf("這兩個座標是X1:%d Y1:%d X2:%d Y2:%d\n",P[x][0],P[x][1],P[y][0],P[y][1]);

      return sqrt(min);

}

void main()

{

    int A[N][2];

      int i,j;

      printf("使用隨機函式獲得以下點 X Y:\n");

      haha(A,N);

      for(i=0;i<N;i++){

           for(j=0;j<2;j++){

             printf("%d ",A[i][j]);

             }

             printf("\n");

             }

      printf("兩點最短距離是:%lf\n",ClosestPoints(A,N));

}

 

4. 程式設計實現教材3.2小節排序問題中的兩個排序演算法(選擇排序,氣泡排序),要求用函式實現排序演算法,主函式中呼叫。待排序資料用隨機數產生(這個過程建議也用一個函式實現。)

 

#include<stdio.h>

#include<stdlib.h>

#define N 10

#include<time.h>

void haha(int a[],int n)

{

   int i;

   srand((unsigned)time(0));

   for(i=0;i<n;i++){

     a[i]=rand()%20;

   }

}

void SelectionSort(int a[],int n)

{

     int i,min,j,t;

       for(i=0;i<n-1;i++){

        min=i;

          for(j=i+1;j<n;j++){

           if(a[j]<a[min])

             min=j;

                }

           t=a[i];

           a[i]=a[min];

           a[min]=t;

               }

}

void main()

{

        int a[N];

        int i;

          haha(a,N);

        printf("排序前\n");

        for(i=0;i<N;i++){

            printf("%d ",a[i]);

         }

        printf("\n");

        printf("排序後\n");

        SelectionSort(a,N);

        for(i=0;i<N;i++){

           printf("%d ",a[i]);

    }

          printf("\n");

}

 

#include<stdio.h>

#include<stdlib.h>

#define N 10

#include<time.h>

void haha(int a[],int n)

{

   int i;

   srand((unsigned)time(0));

   for(i=0;i<n;i++){

     a[i]=rand()%20;

   }

}

void BubbleSort(int a[],int n)

{

      int i,j,t;

      for(i=0;i<=n-1;i++){

        for(j=0;j<=n;j++){

          if(a[j+1]<a[j]){

            t=a[j+1];

            a[j+1]=a[j];

            a[j]=t;

                }

            }

        }

}

 

void main()

{

        int a[N];

        int i;

          haha(a,N);

        printf("排序前\n");

        for(i=0;i<N;i++){

            printf("%d ",a[i]);

         }

        printf("\n");

        printf("排序後\n");

        BubbleSort(a,N);

        for(i=0;i<N;i++){

           printf("%d ",a[i]);

    }

          printf("\n");

}