一、实例名称:算法问题求解基础
二、实例目的
练习以下算法
1.欧几里得递归算法
2.欧几里得迭代算法
3.连续整数检测算法
4.递归算法
三、实例内容
第一部分 欧几里得算法求最大公约数
问题:
1. 计算:34931与 75236 的最大公约数:
1 #include<iostream.h> 2 3 //1.欧几里得递归算法 4 void Swap(int&a,int&b) 5 { 6 int c=a;a=b;b=c; 7 } 8 9 int RGcd(int m,int n) 10 { 11 if(m==0) 12 return n; 13 return RGcd(n%m,m); 14 } 15 16 int Gcd1(int m,int n)//对照程序1-1 17 { 18 19 if(m>n) 20 { 21 Swap(m,n); 22 } 23 return RGcd(m,n); 24 } 25 26 27 // 2.欧几里得迭代算法 28 int Gcd2(int m,int n)//对照程序1-2 29 { 30 if(m==0) 31 { 32 return n; 33 } 34 if(n==0) 35 { 36 return m; 37 } 38 if(m>n) 39 { 40 Swap(m,n); 41 } 42 while(m>0){ 43 int c=n%m;n=m;m=c; 44 } 45 return n; 46 } 47 48 //3.连续整数检测算法 49 50 int Gcd3(int m,int n)//对照程序1-3 51 { 52 //学生输入程序部分 53 if(m==0) return n; 54 if(n==0) return m; 55 int t = m>n?n:m; 56 while(m%t || n%t) t--; 57 return t; 58 } 59 int main(int argc, char *argv[]) 60 { 61 int m,n; 62 cout<<"---欧几里得算法求最大公约数---"<<endl; 63 cout<<"请输入第一个数m:"; 64 cin>>m; 65 cout<<"请输入第二个数n:"; 66 cin>>n; 67 int result; 68 result = Gcd1(m,n); 69 cout<<"Gcd1函数运算结果为:"<<result<<endl; 70 result = Gcd2(m,n); 71 cout<<"Gcd2函数运算结果为:"<<result<<endl; 72 result = Gcd3(m,n); 73 cout<<"Gcd3函数运算结果为:"<<result<<endl; 74 }
2. 增加Gcd1、Gcd2、Gcd3中计算运算次数的语句,估算哪一个更快,最快与最慢相差多少倍。
第二部分 逆序输出正整数序列
程序问题:
1. 输入一个1234567890求逆序。
2. 输入一个4294967296 求逆序。
1 #include <iostream.h> 2 //逆序输出正整数序列 3 4 void PrintDigit(int n){ 5 cout<< n%10; 6 if(n>=10){ 7 PrintDigit(n/10); 8 } 9 } 10 11 int main(){ 12 int n; 13 cin>>n; 14 PrintDigit(n); 15 }
第三部分 汉诺塔问题
程序问题:
1. 3个盘子的移动顺序:
The disk |
| is moved from |
| to top of tower |
|
The disk |
| is moved from |
| to top of tower |
|
The disk |
| is moved from |
| to top of tower |
|
The disk |
| is moved from |
| to top of tower |
|
The disk |
| is moved from |
| to top of tower |
|
The disk |
| is moved from |
| to top of tower |
|
The disk |
| is moved from |
| to top of tower |
|
2. 如果5个盘子移动,需要( )步完成。
1 #include <stdio.h> 2 //第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔 3 int i=1;//记录步数 4 void move(int n,char from,char to) //将编号为n的盘子由from移动到to 5 {printf("第%d步:将%d号盘子%c---->%c\n",i++,n,from,to); 6 } 7 void hanoi(int n,char from,char denpend_on,char to)//将n个盘子由初始塔移动到目标塔(利用借用塔) 8 { 9 if (n==1) 10 move(1,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地 11 else 12 { 13 hanoi(n-1,from,to,denpend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上 14 move(n,from,to); //将剩下的一个盘子移动到目的塔上 15 hanoi(n-1,denpend_on,from,to);//最后将借用塔上的n-1个盘子移动到目的塔上 16 } 17 } 18 int main() 19 { 20 printf("请输入盘子的个数:\n"); 21 int n; 22 scanf("%d",&n); 23 char x='A',y='B',z='C'; 24 printf("盘子移动情况如下:\n"); 25 hanoi(n,x,y,z); 26 }
四、实例总结