ybt1207 最大公约数问题 递归经典例题

ybt1207 最大公约数问题

递归典例

(选它只是因为太典型,不是因为懒得做难题故意放水)

【题目描述】

给定两个正整数,求它们的最大公约数。

【输入】

输入一行,包含两个正整数(<1,000,000,000)。

【输出】

输出一个正整数,即这两个正整数的最大公约数。

【输入样例】

6 9

【输出样例】

3

【题解】

求最大公约数明明可以两个数同时试除所有小于等于它们的算术平方根的质数,然后把整除的数累乘,得到结果,但是这种算法不光写起来很麻烦,而且的复杂度是:
\[
O(\sqrt{n})
\]
很显然,辗转相除是一个更好的方案,辗转相除法,这种算法是用大的数除以小的数(舍掉余数),然后所得的商作为较小的数,之前较小的数作为较大的数,进行同样的运算,直到较小的数为0,这时较大的数便就是一开始两数的最大公约数。

这种算法的证明却没有算法一样简单(其实我不会),如果哪天我有想法(卡题了失去梦想),就对算法进行证明

这种算法的复杂度为:
\[
O(log(n))
\]
非常的优秀,堪称递归界的一股清流。

接下来看看代码(故意加很多回车显得代码很长)

#include<iostream>
using namespace std;
int a;
int b;
int f(int a,int b)//算法主体
{
    if(b==0)
    {
        return a;
    }
    return f(b,a%b);
}
int main()
{
    cin>>a>>b;
    if(b>a)//保证a大
    {
        int t;
         t=a;
        a=b;
        b=t;
    }
    cout<<f(a,b)<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/Wild-Donkey/p/12229906.html

时间: 2024-09-29 20:17:43

ybt1207 最大公约数问题 递归经典例题的相关文章

到底什么是dp思想(内含大量经典例题,附带详细解析)

期末了,通过写博客的方式复习一下dp,把自己理解的dp思想通过样例全部说出来 说说我所理解的dp思想 dp一般用于解决多阶段决策问题,即每个阶段都要做一个决策,全部的决策是一个决策序列,要你求一个 最好的决策序列使得这个问题有最优解 将待求解的问题分为若干个相互联系的子问题,只在第一次遇到的时候求解,然后将这个子问题的答案保存 下来,下次又遇到的时候直接拿过来用即可 dp和分治的不同之处在于分治分解而成的子问题必须没有联系(有联系的话就包含大量重复的子问题,那 么这个问题就不适宜分治,虽然分治也

欧几里得求最大公约数--JAVA递归实现

欧几里得算法求最大公约数算法思想: 求p和q的最大公约数,如果q=0,最大公约数就是p:否则,p除以q余数为r,p和q的最大公约数即q和r的最大公约数. java实现代码: 1 public class Demo0 { 2 public static void main(String[] args) { 3 4 System.out.println(gcd(24,120)); 5 } 6 7 8 public static int gcd(int p,int q){ 9 10 if(q==0)

[Python]Python 经典例题

Python 经典例题 1 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. #!/usr/bin/python # -*- coding: UTF-8 -*- from sys import stdout for j in range(2,1001): k = [] n = -1 s = j for i in range(1,j): if j % i == 0: n += 1 s -= i k.append(i) if

java--------动态的经典例题

多态一: 什么是动态: 同一行为的多种不同表达,或者同一行为的多种不同实现就叫做多态. 1)Person,Student,Teacher之间的关系 2)有一个"车"的父类,宝马继承自车,奔驰继承自车.那么反过来,车可以是宝马,也可以是奔驰,具有不同的形态,这种现象就叫多态.  如,我要上街买个东西,请你给我一辆车,这时你传给我的车(一个Car对象,形参)的一个实例(实参)就是多态(可以有不同的实现,宝马.奔驰.自行车等都可以). 3) "笔"是父类,钢笔.铅笔.圆珠

基本SQL练习题--选课经典例题

为管理岗位业务培训信息,建立3个表: S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号.学员姓名.所属单位.学员年龄 C (C#,CN ) C#,CN 分别代表课程编号.课程名称 SC ( S#,C#,G ) S#,C#,G 分别代表学号.所选修的课程编号.学习成绩 1. 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名 --实现代码: Select SN,SD FROM S Where [S#] IN( Select [S#] FROM C,SC Whe

数据库与信息系统经典例题

数据库与信息系统经典例题 @阆苑祁寒 更新时间:2020-01-03 此版本是最终版本. 经典例题取自<数据库与信息系统>课程,仅供学术交流和期末复习,如有错误请指出,转载时请注明出处! 一.基础概念核查(填空) 用户创建数据库时,其主要数据文件的初始大小必须不小于_______系统数据库的大小. 关系数据模型由关系_______.______和_________三部分组成. 设有某个文件,当向其中插入一条新记录时,首先读文件头,找到最末磁盘块的地址后将最末磁盘块读入内存缓冲区,在缓冲区内将新

AC自动机【模板】+经典例题

AC自动机模板 经典例题 Keywords Search HDU - 2222 [求目标串中出现了几个模式串] [(注意:模式串可能会重复)] 模板: 1 const int maxn=26; 2 struct Trie 3 { 4 int next[500010][maxn]; 5 int fail[500010],end[500010]; 6 int root,L; 7 int newnode() //初始化 8 { 9 for(int i=0;i<26;i++) 10 next[L][i]

一次性弄懂到底什么叫做分治思想(含有大量经典例题,附带详细解析)

期末了,通过写博客的方式复习一下算法,把自己知道的全部写出来 分治:分而治之,把一个复杂的问题分解成很多规模较小的子问题,然后解决这些子问题,把解决的子问题合并起来,大问题就解决了 但是我们应该在什么时候用分治呢?这个问题也困扰了我很久,做题的时候就不知道用什么算法 能用分治法的基本特征: 1.问题缩小到一定规模容易解决 2.分解成的子问题是相同种类的子问题,即该问题具有最优子结构性质 3.分解而成的小问题在解决之后要可以合并 4.子问题是相互独立的,即子问题之间没有公共的子问题 第一条大多数问

递归经典题

递归思想:方法自己调用自己,使用是要避免堆栈溢出 java.lang.StackOverflowError 递归步骤: 递推:将复杂的问题,变成简单问题,最后到一个最简单的状态,此时有一个已知值(追本溯源) 回归:再从已知值,从简单状态算到复杂状态 递归优点,思想简单:递归缺点,效率低 1.斐波那契数列 斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:1.1.2.3.5.8