辗转相除法求H.C.F小结
辗转相除法
大纲:
- 问题
- 原理
- 反思
1. 问题
一个试题,请完成以下填空
下列程序是利用辗转相除法求H.C.F(最大公约数)
include <stdio.h>
int main(){
int m,n,r;
scanf(“%d%d”,&m,&n);
r=[?];
while([?]){
m=[?];n=r;r=[?];
printf(“h.c.f is %d”,n);
return ;
}
应试时未想出解
为什么想不出?
首先是不知道什么是辗转相除法,辗转?m除一下,n除一下?翻来?覆去?
然后在想r是不是m*n
开始在纸上演算,发现几对数字中大数模小数可以得到h.c.f,不过又觉得这题用不到模,所以这种方法被我否定了,后面则是尝试用r=m*n,m=r/2,r=n/m;这种交换,不通,空一的初始化与空二的边界值难以确定
空一:相乘?
空二:输出与r对应,可r到哪为止呢?
空三:m走来被改写???wtf???? M? r/n??
空四:r给n了,r要做次改变,r怎么变呢?辗转相除???
总结失败原因
根本原因,不懂辗转相除法的数学原理
数学知识面窄了
次要原因,问了几个同学,其中一个人用试的给试出来了,另一个数学好,知道怎么做,试出来人的说:
空2是看到输出的是r,所以空2写的r!=0(wtf??),还说这题肯定用模做(wtf???为什么能猜这么准)
求其思考过程,说是先填了几个公试,再调试尝试(wtf??)
没搞懂他是怎么试出来的,到下笔时还是不懂他为什么能成功试出来
2. 原理
设这是一个求a,b两数的H.C.F的函数 gcd(a,b);
gcd(a,b);
如果a>b &&a%b!=0
gcd(a,b)===gcd(b,a%b)
请看到这里的同学拿出笔演算一下,用短除法什么的
拓展阅读:其数学证明
下面给出c代码
int gcd(int a,int b){
return a%b==?b:gcd(b,a%b);
}
解读,拿a,b中那个大的数,模小的数,看结果是不是零,是零就输出小的
10 与 5的H.C.F就是5
不是零
10 与 8
10%8=2
到此,用余数去替换大数,然后继续//本文重点
递归 gcd(8,2)
得到2
- 特别注意的点 -
用了模的性质巧妙的碰开了先输大的,再输小的,的问题
5 %10=5,10=5,gcd(10,5)
现在,你可以完成大纲一中的问题了吗?
3. 反思
- 以后我是否还会碰到这种——实现不难,可不知其原理,就无法解题,的题目
- 打算抽空刷经典算法(math)题
2.我的同学是怎么在不懂原理的情况下解题的
- 方向对了,用了模,r!=0神猜测,后面调试把m=n试出来了
3.若是我尝试用模做,是否也能做出这题,所以它给我的教训是?
- 有一定可能。遇题先广搜一波,然后对每个可能的点(方向)进行部分深搜
辗转相除法求H.C.F小结的更多相关文章
- C实现辗转相除法求两个数的最大公约数
什么是辗转相除法? 辗转相除法(又名欧几里德算法),它主要用于求两个正整数的最大公约数.是已知的最古老的算法. 用辗转相除法求132和72的最大公约数的步骤: 132 / 72 = 1 ... 60 ...
- [LeetCode] H-Index 求H指数
Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...
- 辗转相除法求最大公约数,非goto
#include<iostream> using namespace std; //不推荐用goto,当然用它更快 //辗转相除法求两数的最大公约数 int gcd(long int a, ...
- [洛谷P1029]最大公约数与最小公倍数问题 题解(辗转相除法求GCD)
[洛谷P1029]最大公约数与最小公倍数问题 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P, ...
- [CodePlus 2017 11月赛]晨跑 题解(辗转相除法求GCD)
[CodePlus 2017 11月赛]晨跑 Description "无体育,不清华"."每天锻炼一小时,健康工作五十年,幸福生活一辈子".在清华,体育运动绝 ...
- 使用辗转相除法求两个数的最大公因数(python实现)
数学背景: 整除的定义: 任给两个整数a,b,其中b≠0,如果存在一个整数q使得等式 a = bq 成立,我们就说是b整除 ...
- C语言辗转相除法求2个数的最小公约数
辗转相除法最大的用途就是用来求两个数的最大公约数. 用(a,b)来表示a和b的最大公约数. 有定理: 已知a,b,c为正整数,若a除以b余c,则(a,b)=(b,c). (证明过程请参考其它资料) 例 ...
- 算法:辗转相除法求最大公约数(C语言实现)
辗转相除法,一种求最大公约数的算法 已知:A / B = C ······ R (A.B.C.R皆是整数) 假设:D是A的余数,D也是B的余数,那么D就是A和B的公约数 D是A和B的约数,则A和B是 ...
- [LeetCode] H-Index II 求H指数之二
Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize ...
随机推荐
- 二分法查找-java案例详解
/** * 功能:二分查找 * 基本思想: * 假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较, * 如果当前位置值等于x,则查找成功:若x小于当前位置值,则在数列的 * 前半段中查找 ...
- 关于bootstrap的modal弹出层嵌套子Modal所引发的血案(转)
原文地址 http://blog.csdn.net/liuxiaogangqq/article/details/51821359 bootstrap的弹出层嵌套有一个问题 ,当子modal关闭时父的m ...
- Delphi 获取内存及CPU信息的函数
Uses MemoryCpuUtils;//首先引用该单元 //声明下列变量用来存储读取的数值 Var iTotalPhysics, iTotalVirtual, iTotalPageFile, iC ...
- centos 安装mysql 5.5.12
1.安装gcc-c++ gcc make cmake编译器 2.安装ncurses 3.添加用户组 groupadd mysql useradd -r -g mysql mysql 4.安装 tar ...
- java 数据设置和显示
1. 首先设置ModelAndView 的值 @Override public ModelAndView handleRequest(HttpServletRequest arg0, HttpServ ...
- easyui-datagrid分页查询
不想写语言描述了,直接代码吧! js: $(document).ready(function () { var driver_datagrid; $('#job').combobox({ url: ' ...
- PHP1.0版本上传OSS报错,仿照2.0版本传入的居然是句柄
代码如下: $oss_sdk_service = new ALIOSS(); $oss_sdk_service->set_debug_mode(FAL ...
- 对lua中_ENV表的理解(lua5.2版本以后)
当我拿到_ENV表的时候,会去想这个_ENV表是干什么用的? 首先看如下代码: print(_ENV) --0x1d005f0 print(_G) --0x1d005f0 ViewCode 看了上面的 ...
- 基于basys2驱动LCDQC12864B的verilog设计图片显示
话不多说先上图 前言 在做这个实验的时候在网上找了许多资料,都是关于使用单片机驱动LCD显示,确实用单片机驱动是要简单不少,记得在FPGA学习交流群里问问题的时候,被前辈指教,说给我最好的指教便是别在 ...
- 【python基础】之元组 集合 字典
元组 元组:元组和列表类似.但是元组中的元素是固定的(不能给一个元组添加,删除和替换元素以及重新排序) 1.创建元组 t1 = () #创建一个空元组 t2 = (1, 2, 3) t3 = tupl ...