首页 > 代码库 > 实验一 算法问题求解基础--欧几里得递归算法和递归算法
实验一 算法问题求解基础--欧几里得递归算法和递归算法
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-117 {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-229 {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-351 {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 else12 {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 }
实验一 算法问题求解基础--欧几里得递归算法和递归算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。