刷题记录:牛客NC22164更相减损术
传送门:牛客
题目描述:
利用更相减损术求两个整数的最大公约数,即每次将较大的数变成大数减去小数的值
输入:
4 6
输出:
2
这道题的题目就表明了用更相减损术来求这道题的gcd值(即最小公约数),但是与其使用原题的更相减损术来求gcd,不如继续发展一下,直接使用辗转相除法来解决这种问题,接着就开始介绍一下辗转相处法的具体定义:
辗转相除法给我们展现了以下的一个结论(在后面会有证明),
假设有两个数字a,b.我们可以有以下结论,gcd(a,b)=gcd(b,r),其中r是a除以b得到的余数,即a=bq+r下面来证明这个结论:首先,我们假设a,b同时可以整除u即a=s1*u,b=s2*u
然后我们有
r=a-bq <=> r=s1u-s2uq=(s1-s2q)*u
所以我们就有了u能被r整除,也就是说u是a,b,r三个数的余数然后,我们再假设b,r可以同时整除v即b=w1*v,r=w2*v
然后我们就有
a=bq+r <=> a=w1*v*q+w2*v=(w1q+w2)*v
所以我们就有了v也能被a整除,也就是说v也是a,b,r三个数的余数然后同理,我们就会的到,a,b,r三个数拥有同样的任何一个因数,所以既然最小公约数也是其中的一个因数,所以我们
就自然而然的会得到gcd(a,b)=gcd(b,r)自此证毕
接下来是gcd的代码部分
int gcd(int a,int b) {if(b==0) return a;else {return gcd(b,a%b);}
}
/*
其中终止边界为b==0,这是因为此时的b其实是上一位的余数,假设此时的余数为0的话,也就是说上一次的取模过程中
是能够整除的,也就是说此时的a当然就是我们所要的最小公约数了然后或许有人会有疑问我们为什么要将b与a%b调换位置呢,
其实不换也是没有任何问题的,但是我们会发现每次取模之后a%b的值肯定是小于我们的b的值的,然后为了每次的取
模过程的方便,我们每次都较大的值放在前面
*/然后我们可以继续的精简我们的gcd代码:int gcd(int a,int b) return b?gcd(b,a%b):a;有了精简代码以后就可以随时调用啦
接下来是本题代码部分:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
#define maxn 1000000
int gcd(int a,int b) return b?gcd(b,a%b):a;
int main() {int a,b;a=read(),b=read();cout<<gcd(a,b)<<endl;return 0;
}
刷题记录:牛客NC22164更相减损术相关推荐
- c语言碾转相除法,从高中碾转相除法、更相减损术算法谈起
编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾经见过不少的算法题,发现有的并不在数据 ...
- 更相减损法java,五十6、从高中碾转相除法、更相减损术算法谈起
「@Author:Runsen」git ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」github ❞ 先问大家一个小学问题:「如何求两个整 ...
- 更相减损法java,五十六、从高中碾转相除法、更相减损术算法谈起
「@Author:Runsen」❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」❞ 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾 ...
- 五十六、从高中碾转相除法、更相减损术算法谈起
@Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题代码化. ---- Runsen 先问你们一个小学问题:如何求两个整数的最大公约数? 曾经见过不少的算法题 ...
- 《九章算术》中更相减损术----求最大公约数
更相减损法:也叫更相减损术,是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合. #include<stdio.h> in ...
- Python使用更相减损术计算两个整数的最大公约数
更相减损术是<九章算术>中给出的一种用于约分的方法,也可以用来计算最大公约数,其步骤为: 1)如果两个整数都是偶数,就使用2约简,直到两个整数不再都是偶数,然后执行第2步.如果两个整数不都 ...
- 【原创】更相减损术 stein算法 欧几里得算法 拓展欧几里得算法 扩展欧几里得算法 逆元的计算与筛法 解模线性方程
欧几里得 说在前面 数论学复习 Part 6. 然后再来一章CRT和组合数,就飞往概率,以此为跳板去向DP. 计划很美啊你. P.S. 这么说来拉格朗日插值可以说是数论学复习的Part 0了啊. 有一 ...
- 更相减损术--最大公约数
题目: 更相减损术 ,哈哈,我们今天来看一道稍微复杂一点的题嘛,这是选自codeforce上的一道题,好了,我们一起来看看题意吧: 题目描述是复制的,可能有部分显示不对,我就把题目链接放下面! 题目链 ...
- 求最大公约数和最小公倍数——辗转相除法(欧几里得算法)、更相减损术、stein算法
辗转相除法-- 辗转相除法求最大公约数的原理: 两个整数其中较小的数 和 两数相除(较大数除较小数)的余数(使用递归)的最大公约数. 辗转相除法求最小公倍数的原理: 两个整数分别除以最大公约数的结果相 ...
最新文章
- 成果展示 | 清华大学大数据研究中心——医工结合科研创新支持计划
- Yann Lecun最新演讲:机器怎样进行有效学习?
- 转:inux shell脚本的字符串截取
- JAVA的网络编程【转】
- python pexpect pxssh scp_python Pexpect 实现输密码 scp 拷贝的方法
- 数组 this.setData快捷赋值
- Umbrella Network与Linear Finance合作,将专业金融数据带入DeFi
- 普通二本,去了小公司,我也想改变
- USACO 2.3 Controlling Companies(DFS)
- sht30温湿度传感器中文手册_DHT11温湿度传感器编程思路以及代码的实现
- Mysql索引失效OR语句
- ROS2与C++入门教程-进程内(intra_process)话题发布和订阅演示
- uniapp拍照上传照片流程笔记
- linux硬盘格式化物理卷,创建物理卷报错Can't open /dev/sdb5 exclusively. Mounted filesystem的问题解决过程记录......
- CF1108D Diverse Garland
- 什么是TTO热转印色带?
- 【将数组a中n个整数按相反顺序存放】
- 【机器学习】逻辑回归(LogisticRegression)原理与实战
- 股票/期货分仓系统都能实现什么功能?
- C语言基本数据类型输入输出格式