文章目录

  • 前言
  • 一、名称定义
    • 1.最大公约数
    • 2.辗转相除法
    • 3.更相减损法
  • 二、ACM杭电入门题
    • 1.解题思路
  • 三、解题参考代码(C语言,C++)
    • 0.最优算法(C++)
    • 1.辗转相除求解(C语言)
    • 2.更相减损法求解(C语言)
  • 总结

前言

本篇博客对:最大公因数,辗转相除法,更相减损法等专有名词进行了详细的介绍,分享了两种求解最大公因数的算法代码,以杭州电子科技大学的ACM入门题作为索引,借助实际代码,对上面介绍的两种算法求解最大公因数进行初级应用,粗略地介绍了递归思想对算法的优化。

一、名称定义

1.最大公约数

定义:最大公因数是指两个或多个整数共有约数中最大的一个。

示例:12、16的公约数有1、2、4,其中最大的一个是4,4是12与16的最大公约数。

2.辗转相除法

定义:辗转相除法是求两个自然数的最大公约数的一种方法。

示例:求319,377的最大公约数
319÷377=0(余319)
377÷319=1(余58)
319÷58=5(余29)
58÷29=2(余0)
当余数为0时,除数即为最大公约数:29

  1. while循环
int fun(int m,int n)
{int r; //余数,当余数为0的时候,m即为最大公约数while(n!= 0)//先取余,再用余数对较小的数求余,直到余数为零 {r = m % n;m = n;n = r;}return m;            //将结果返回
}
  1. 调用递归
int fun(int m,int n)
{if(n!=0) return fun(n,m%n);return m;
}
  1. 简化递归
int fun(int m, int n)
{return n ? fun(n, m % n) : m;
}

3.更相减损法

定义:更相减损法是出自《九章算术》的一种求最大公约数的算法。

示例:求98与63的最大公约数。
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
7-7=0
当差为0时,除数即为最大公约数:7


while循环

int fun(int m,int n)
{while(m!=n)     //当差为0的时候,n即为最大公约数{if(m>n)m=m-n;elsen=n-m;}return n;
}

二、ACM杭电入门题

先来看一个杭电的水题,看看有有没有解题思路

ACM编程题(请根据下列各题目的描述、输入和输出要求,分别写出相应正确的代码)
----------------------------------第11题(hdu2503)--------------------------------
(1)题目
a/b + c/d
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
给你2个分数,求他们的和,并要求和为最简形式。
Input
输入首先包含一个正整数T(T<=1000),表示有T组测试数据,然后是T行数据,每行包含四个正整数a,b,c,d(0<a,b,c,d<1000),表示两个分数a/b 和 c/d。
Output
对于每组测试数据, 输出两个整数e和f,表示a/b + c/d的最简化结果是e/f,每组输出占一行。
Sample Input
2
1 2 1 3
4 3 2 3
Sample Output
5 6
2 1

  • 本题在ACM中并不难,主要考察是否掌握最大公约数的求法

1.解题思路

  • 先求解出未化简的e,f
  • 再求出最大公因数z(两种方法)
  • 最后输出e=e/z, f=f/z

三、解题参考代码(C语言,C++)

0.最优算法(C++)

一个优秀的acmer总是寻求最优算法(辗转相除法时间复杂度优于更相减损法)

本段代码为c++语言编写,新手小白看不懂可以看下面的C语言解题

#include<iostream>             //头文件
using namespace std;
int fun(int m,int n)           //定义函数   辗转相除法
{return n?fun(n,m%n):m;     //求解最大公因数n,返回其值
}
int main()
{   int n,a,b,c,d,e,f,z;      //n行数,z最大公约数cin>>n;while(n--){                cin>>a>>b>>c>>d; e=a*d+b*c;f=b*d;z=fun(e,f);           //调用函数返回最大公约数 cout<<e/z<<f/z;       //输出最简答案}return 0;
}

1.辗转相除求解(C语言)

(1)参考代码:

#include<stdio.h>
int main()
{int t,e,f,m,n,tmp,r;scanf("%d",&t);for(int i=0;i<t;i++){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);e=a*d+b*c;f=b*d;///进行最大公约数的求解(f,e) <==> (m,n)m=f;n=e;///辗转相除r=m%n;while(r!=0){m=n;n=r;r=m%n;}///经过上面的辗转过程,所求的最大公约数就是n//printf("%d %d\n", e/n, f/n);}return 0;
}

2.更相减损法求解(C语言)

(2)参考代码:

#include<stdio.h>
int main()
{int t,e,f,m,n;scanf("%d",&t);for(int i=0;i<t;i++){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);e=a*d+b*c;f=b*d;///进行最大公约数的求解(f,e) <==> (m,n)m=f;n=e;//辗转相减while(m!=n){if(m>n)m=m-n;elsen=n-m;}///经过上面的辗转过程,所求的最大公约数就是n//printf("%d %d\n",e/n,f/n);}return 0;
}

总结

今天的分享就到这里啦,喜欢小编博客的可以点赞支持哦,觉得内容对你有用的可以收藏备用
最后,祝我们早日抗疫成功,摘下口罩和最想见面的人见面,齐心抗疫,众志成城!

最详细最简单:最大公因数求法、辗转相除法、更相减损法,入门ACM,杭电水题,算法递归,初级算法题一看就懂相关推荐

  1. 辗转相除法+更相减损法求最大公约数

    怎么求两个数的最大公约数呢? 简单的想法就是直接暴力枚举,试出最大公约数 #暴力枚举 #暴力枚举 def GCD(numberA,numberB):gcd=1for i in range(2,max( ...

  2. 求最大公约数与最小公倍数 (辗转相除法+更相减损法+Stein算法)

    辗转相除法与更相减损法对比: (1)两者都是求最大公因数的方法,计算上辗转相除法以除法为主,更相减损术以减法为主,计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显 ...

  3. 辗转相除法、更相减损法、Stein算法

    最大公约数和最小公倍数求解,常用的方法是短除法进行因式分解,然后最大公约数是所有公共因子的乘积,最小公倍数是所有因子的乘积. 本质上求最小公倍数就是求最大公倍数:x=m*a, y=m*b:m是最大公约 ...

  4. C语言复习---获取最大公约数(辗转相除法和更相减损法)

    源自:百度百科 辗转相除法 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法. 例如,求(319,377): ∵ 319÷377=0(余319) ∴(319,377)=(3 ...

  5. C语言实现辗转相除法和更相减损法求两数最大公约数,及求最小公倍数的方法

    在学习从C语言过程中,我们会遇到一个题目,求两个整数的最大公约数,那么接下来分别介绍两种方法求最大公约数 1,辗转相除法 辗转相除法, 又名欧几里德算法(Euclidean Algorithm),是求 ...

  6. C:求两个数的最大公约数详解(硬核算法,辗转相除法,更相减损法)

    最大公因数,也称最大公约数.最大公因子. 定义: 指两个或多个整数共有约数中最大的一个. a,b的最大公约数 记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有 ...

  7. 最大公约数:常用的四大算法求解最大公约数,分解质因数法、短除法、辗转相除法、更相减损法。

    常用的四大算法求解最大公约数,分解质因数法.短除法.辗转相除法.更相减损法. (本文获得CSDN质量评分[91]) [学习的细节是欢悦的历程] Python 官网:https://www.python ...

  8. 【最大公约数 GCD】 --- 常用四大算法(辗转相除法,穷举法,更相减损法,Stein算法)

    [最大公约数 GCD] --- 常用的四大算法 1. 辗转相除法(又名欧几里德算法) 2. 穷举法(也称枚举法) 3. 更相减损法 (又名辗转相减法) 4. Stein算法 1. 辗转相除法(又名欧几 ...

  9. 求最大公约数和最小公倍数(更相减损法/辗转相除法)

    目录 一.最大公约数 1.1 更相减损法 1.2 辗转相除法 二.最小公倍数 2.1 最小公倍数=两数相乘/最大公约数 2.2 用较小数的倍数除以较大数 一.最大公约数 1.1 更相减损法 原理如下图 ...

最新文章

  1. 用Visual C#做DLL文件
  2. Cordova for iOS[ PhoneGap]
  3. C#深入解析Json格式内容
  4. Vue 中使用watch监听$route 无效问题
  5. 计算机入门 姚班,清华“姚班”:学霸中的尖子生,大佬毕业后都去哪了?
  6. 2021年中国手机游戏行业研究报告
  7. UVA 10004 Bicoloring
  8. python标点符号全是英文吗_python 过滤中文、英文标点特殊符号
  9. 清理localstorage_清除浏览器localstorage的数据
  10. 类似switchhost 的简单host切换工具
  11. redis key 操作大全
  12. 台式计算机进入安全模式蓝屏,电脑进安全模式蓝屏怎么办
  13. Hadoop集群报错解决及hadoop fs 的常用操作
  14. 卢旺达饭店插曲--Million Voices
  15. 模拟人生5显示与服务器,模拟人生5之人生无限
  16. Js逆向教程-10常见代码混淆
  17. 双非计算机专业考研失败总结
  18. 【Unity】Unity内存管理与优化(一)内存域、堆栈、垃圾回收、内存泄漏、内存碎片
  19. 获取某种颜色在图片中所占的比例
  20. Windows slmgr.vbs 命令详解

热门文章

  1. CF1527C Sequence Pair Weight
  2. 正极前驱体生产废水除磷
  3. 香港金融中心谁与争锋
  4. 【历史上的今天】10 月 26 日:NetBSD 系统发布;Windows 8 诞生;微软推出 Surface 系列
  5. 无刷电调--BLHELI_S的焊接问题与固件烧录
  6. 实现用友U8+与旺店通ERP数据同步
  7. JAVAWEB学习笔记--Day3
  8. 【英语:基础进阶_读写专项训练】G3.记叙文写作
  9. C++程序设计课程主页-2013级
  10. Android蓝牙inputstream,java – 无法在Android平台上使用InputStream为蓝牙套接字创建ObjectInputStream...