算法设计基础
一、实验目的:
理解蛮力法的思想及程序的执行过程;
理解递推算法的思想;
能较熟练地编写枚举、递推程序,对给定的问题能设计出相应算法予以解决。
二、实验环境:
Visual C++ 实验环境下实现并进行调试
三、实验内容:
- 编程求和:s=a+aa+aaa+aaaa+ „„+aaaa„aaa(n个),其中a为1~9中的一个数字。 提示:若第一项为a , 以后每一项由前一项乘以10加上a递推得到,然后求和。
代码:
#include<stdio.h>
int main()
{
      int a,n;
      int s=0;
      int t=0;
      printf("输入a n\n");
      scanf("%d%d",&a,&n);
      printf("输出:\n");
      for(int i=0; i<n; i++)
      {
           t=t*10+a;
           s=s+t;
           if(i==n-1)
           {
                 printf("%d=",t);
           }
           else
           {
                 printf("%d+",t);
           }
      }
      printf("%d\n",s);
      return 0;
}运行结果:
- 编写程序求500 以内的勾股弦数,即满足 c2=b2+a2的3个数,要求b>a。将所有符合要求的组合存入文本文件中 ,每个组合占一行。
代码:
#include<stdio.h>
int main()
{
      int a,b,c;
      for(a=1;a<500;a++)
      {
           for(b=a+1;b<500;b++)
           {
                 for(c=b+1;c<500;c++)
                 {
                      if(c*c==a*a+b*b)
                      {
                            printf("%d %d %d",a,b,c);
                            printf("\n");
                      }
                      if(c*c-a*a-b*b>0)
                            break;
                 }
           }
      }
      return 0;
}运行结果:
- 最近点对问题:求解平面点集n个点中距离最近的两个点之间的问题。(这里用蛮力法)。
代码:
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
double ClosestPoints(int P[][2],int n,int ind1, int ind2);
int main()
{
      int n=0;
      srand(time(0));
      while(n<=1)
      {
           n=rand()%10;
      }
      int p[100][2];
      printf("随机生成的%d个点为:\n",n+1);
      for(int i=0;i<=n;i++)
      {
           p[i][0]=rand()%10;
           p[i][1]=rand()%10;
           printf("p%d(%d,%d)\n",i,p[i][0],p[i][1]);
      }
      double distance=ClosestPoints(p,n,0,0);
      distance=sqrt(distance);
      printf("最近距离为:%lf\n",distance);
      return 0;
}
double ClosestPoints(int P[][2],int n,int ind1, int ind2)
{
      double mind=999999;
      double dis=0;
      for(int i=0; i<=n-2; i++)
      {
           for(int j=i+1; j<=n-1; j++)
           {
                 dis = (P[j][0]-P[i][0])*(P[j][0]-P[i][0])+(P[j][1]-P[i][1])*(P[j][1]-P[i][1]);
                 if(dis<mind)
                 {
                      mind = dis;
                      ind1 = i;
                      ind2 = j;
                 }
           }
      }
      printf("距离最近的两个点为:p%d(%d,%d)",ind1,P[ind1][0],P[ind1][1]);
      printf(",p%d(%d,%d)\n",ind2,P[ind2][0],P[ind2][1]);
      return(mind);
}运行结果:
4. 编程实现排序问题中的两个排序算法(选择排序,冒泡排序),要求用函数实现排序算法,主函数中调用。待排序数据用随机数产生(这个过程建议也用一个函数实现。)
代码:
//选择排序
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<string.h>
void SelectionSort(int n,int A[]);
void Getrandom(int n,int a[]);
void swap(int *x,int *y);
int main()
{
      int array[100];
      int n;
      printf("输入要生成的随机数列的数的个数:");
      scanf("%d",&n);
      printf("生成的随机数列为:");
      Getrandom(n,array);
      printf("\n");
      SelectionSort(n,array);
      printf("排序后的数列为:");
      for(int i=0;i<n;i++)
      {
           printf("%d ", array[i]);
      }
      printf("\n");
      return 0;
}
void SelectionSort(int n,int A[])
{
      int min;
      for(int i=0; i<=n-2;i++)
      {
           min=i;
           for(int j=i+1; j<=n-1;j++)
           {
                 if(A[j]<A[min])
                 {
                      min=j;
                 }
           }
           swap(&A[i],&A[min]);
      }
}
void Getrandom(int n,int a[])
{
      srand(time(0));
      for(int i=0;i<n;i++)
      {
           a[i]=rand()%100;
           printf("%d ",a[i]);
      }
}
void swap(int *x,int *y)
{
      int t;
      t=*x;
      *x=*y;
      *y=t;
}运行结果:
//冒泡排序
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<string.h>
void Getrandom(int n,int a[]);
void BubbleSort(int n,int A[]);
void swap(int *x,int *y);
int main()
{
       int array[100];
       int n;
       printf("输入要生成的随机数列的数的个数:");
       scanf("%d",&n);
       printf("生成的随机数列为:");
       Getrandom(n,array);
       printf("\n");
       BubbleSort(n,array);
       printf("排序后的数列为:");
       for(int i=0;i<n;i++)
       {
              printf("%d ", array[i]);
       }
       printf("\n");
       return 0;
}
void BubbleSort(int n,int A[])
{
       for(int i=0;i<=n-2;i++)
       {
              for(int j=0;j<=n-2;j++)
              {
                     if(A[j+1]<A[j])
                     {
                            swap(&A[j],&A[j+1]);
                     }
              }
       }
}
void Getrandom(int n,int a[])
{
       srand(time(0));
       for(int i=0;i<n;i++)
       {
              a[i]=rand()%100;
              printf("%d ",a[i]);
       }
}
void swap(int *x,int *y)
{
       int t;
       t=*x;
       *x=*y;
       *y=t;
}运行结果:
