Fork me on GitHub

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

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

二、实例目的

练习以下算法

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 }

 

四、实例总结

 

posted @ 2014-12-08 21:52  刘哥聊技术  阅读(1923)  评论(0编辑  收藏  举报