zoukankan      html  css  js  c++  java
  • 算法实例一 算法问题求解基础--欧几里得递归算法和递归算法

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

    二、实例目的

    练习以下算法

    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
    ",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("请输入盘子的个数:
    ");
    21      int n;
    22      scanf("%d",&n);
    23      char x='A',y='B',z='C';
    24      printf("盘子移动情况如下:
    ");
    25      hanoi(n,x,y,z);
    26 }

    四、实例总结

  • 相关阅读:
    电脑分屏鼠标移不到另一个电脑上
    jquery datetimepicker 配置参数
    js获取前n天或者后n天的天数
    mysql查看变量
    Underscore _.template 方法使用详解
    sql优化
    echart图表demo
    jquery预加载的几种例子
    树莓派搭建服务器
    Thymeleaf标签学习
  • 原文地址:https://www.cnblogs.com/liuhongfeng/p/4152047.html
Copyright © 2011-2022 走看看