算法实例一 算法问题求解基础--欧几里得递归算法和递归算法
2014-12-08 21:52
369 查看
一、实例名称:算法问题求解基础
二、实例目的
练习以下算法
1.欧几里得递归算法
2.欧几里得迭代算法
3.连续整数检测算法
4.递归算法
三、实例内容
第一部分 欧几里得算法求最大公约数
问题:
1. 计算:34931与 75236 的最大公约数:
2. 增加Gcd1、Gcd2、Gcd3中计算运算次数的语句,估算哪一个更快,最快与最慢相差多少倍。
第二部分 逆序输出正整数序列
程序问题:
1. 输入一个1234567890求逆序。
2. 输入一个4294967296 求逆序。
第三部分 汉诺塔问题
程序问题:
1. 3个盘子的移动顺序:
2. 如果5个盘子移动,需要( )步完成。
四、实例总结
二、实例目的
练习以下算法
1.欧几里得递归算法
2.欧几里得迭代算法
3.连续整数检测算法
4.递归算法
三、实例内容
第一部分 欧几里得算法求最大公约数
问题:
1. 计算:34931与 75236 的最大公约数:
#include<iostream.h> //1.欧几里得递归算法 void Swap(int&a,int&b) { int c=a;a=b;b=c; } int RGcd(int m,int n) { if(m==0) return n; return RGcd(n%m,m); } int Gcd1(int m,int n)//对照程序1-1 { if(m>n) { Swap(m,n); } return RGcd(m,n); } // 2.欧几里得迭代算法 int Gcd2(int m,int n)//对照程序1-2 { if(m==0) { return n; } if(n==0) { return m; } if(m>n) { Swap(m,n); } while(m>0){ int c=n%m;n=m;m=c; } return n; } //3.连续整数检测算法 int Gcd3(int m,int n)//对照程序1-3 { //学生输入程序部分 if(m==0) return n; if(n==0) return m; int t = m>n?n:m; while(m%t || n%t) t--; return t; } int main(int argc, char *argv[]) { int m,n; cout<<"---欧几里得算法求最大公约数---"<<endl; cout<<"请输入第一个数m:"; cin>>m; cout<<"请输入第二个数n:"; cin>>n; int result; result = Gcd1(m,n); cout<<"Gcd1函数运算结果为:"<<result<<endl; result = Gcd2(m,n); cout<<"Gcd2函数运算结果为:"<<result<<endl; result = Gcd3(m,n); cout<<"Gcd3函数运算结果为:"<<result<<endl; }
2. 增加Gcd1、Gcd2、Gcd3中计算运算次数的语句,估算哪一个更快,最快与最慢相差多少倍。
第二部分 逆序输出正整数序列
程序问题:
1. 输入一个1234567890求逆序。
2. 输入一个4294967296 求逆序。
#include <iostream.h> //逆序输出正整数序列 void PrintDigit(int n){ cout<< n%10; if(n>=10){ PrintDigit(n/10); } } int main(){ int n; cin>>n; PrintDigit(n); }
第三部分 汉诺塔问题
程序问题:
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 |
#include <stdio.h> //第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔 int i=1;//记录步数 void move(int n,char from,char to) //将编号为n的盘子由from移动到to {printf("第%d步:将%d号盘子%c---->%c\n",i++,n,from,to); } void hanoi(int n,char from,char denpend_on,char to)//将n个盘子由初始塔移动到目标塔(利用借用塔) { if (n==1) move(1,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地 else { hanoi(n-1,from,to,denpend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上 move(n,from,to); //将剩下的一个盘子移动到目的塔上 hanoi(n-1,denpend_on,from,to);//最后将借用塔上的n-1个盘子移动到目的塔上 } } int main() { printf("请输入盘子的个数:\n"); int n; scanf("%d",&n); char x='A',y='B',z='C'; printf("盘子移动情况如下:\n"); hanoi(n,x,y,z); }
四、实例总结
相关文章推荐
- 算法问题求解基础
- JAVA代码—算法基础:最大连续邮资问题求解
- 回溯算法基础---皇后问题,骑士游历,迷宫求解
- JAVA代码—算法基础:最少货币换钱问题求解(动态规划)
- 数据结构和算法设计(迷宫求解问题的栈和队列的实现)
- NYOJ 布线问题(prime 算法基础)
- 最大子序问题求解算法 笔记
- Trie树的应用,一道算法问题求解 问题分析
- 挑战算法高手:一个Java算法问题求解
- 基础算法系列总结:动态规划(解公司外包成本问题)
- 双排序:从算法的选择到问题求解
- 基础问题求解.
- (转)Gauss消元算法求解开关灯问题
- 【算法导论】双调欧几里得旅行商问题
- 【算法导论】双调欧几里得旅行商问题
- 基础算法系列总结:回溯算法(解火力网问题)
- 使用不同的算法求解0-1背包问题
- N皇后问题求解算法
- 数独求解——面向对象解决算法问题(一)
- 6只青蛙问题 求解算法 请大家赐教