算法实例一 算法问题求解基础--欧几里得递归算法和递归算法

一、实例名称:算法问题求解基础

二、实例目的

练习以下算法

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 }

 

四、实例总结

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值