算法分析 算法设计基础

实验一 算法设计基础

 

一.实验目的

理解蛮力法的思想及程序的执行过程;

理解递推算法的思想;

能较熟练地编写枚举、递推程序,对给定的问题能设计出相应算法予以解决。

 

二.实验基本步骤

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");

}

 

 

猜你喜欢

转载自blog.csdn.net/qq_41398448/article/details/82989924