演算法分析 演算法設計基礎
實驗一 演算法設計基礎
一.實驗目的
理解蠻力法的思想及程式的執行過程;
理解遞推演算法的思想;
能較熟練地編寫列舉、遞推程式,對給定的問題能設計出相應演算法予以解決。
二.實驗基本步驟
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");
}