辗转相除法

大纲:

  1. 问题
  2. 原理
  3. 反思

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.     反思

  1. 以后我是否还会碰到这种——实现不难,可不知其原理,就无法解题,的题目

        -          打算抽空刷经典算法(math)题

  2.我的同学是怎么在不懂原理的情况下解题的

        -          方向对了,用了模,r!=0神猜测,后面调试把m=n试出来了

  3.若是我尝试用模做,是否也能做出这题,所以它给我的教训是?

        -          有一定可能。遇题先广搜一波,然后对每个可能的点(方向)进行部分深搜

辗转相除法求H.C.F小结的更多相关文章

  1. C实现辗转相除法求两个数的最大公约数

    什么是辗转相除法? 辗转相除法(又名欧几里德算法),它主要用于求两个正整数的最大公约数.是已知的最古老的算法. 用辗转相除法求132和72的最大公约数的步骤: 132 / 72 = 1 ... 60 ...

  2. [LeetCode] H-Index 求H指数

    Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...

  3. 辗转相除法求最大公约数,非goto

    #include<iostream> using namespace std; //不推荐用goto,当然用它更快 //辗转相除法求两数的最大公约数 int gcd(long int a, ...

  4. [洛谷P1029]最大公约数与最小公倍数问题 题解(辗转相除法求GCD)

    [洛谷P1029]最大公约数与最小公倍数问题 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P, ...

  5. [CodePlus 2017 11月赛]晨跑 题解(辗转相除法求GCD)

    [CodePlus 2017 11月赛]晨跑 Description "无体育,不清华"."每天锻炼一小时,健康工作五十年,幸福生活一辈子".在清华,体育运动绝 ...

  6. 使用辗转相除法求两个数的最大公因数(python实现)

    数学背景: 整除的定义: 任给两个整数a,b,其中b≠0,如果存在一个整数q使得等式                                        a = bq 成立,我们就说是b整除 ...

  7. C语言辗转相除法求2个数的最小公约数

    辗转相除法最大的用途就是用来求两个数的最大公约数. 用(a,b)来表示a和b的最大公约数. 有定理: 已知a,b,c为正整数,若a除以b余c,则(a,b)=(b,c). (证明过程请参考其它资料) 例 ...

  8. 算法:辗转相除法求最大公约数(C语言实现)

    辗转相除法,一种求最大公约数的算法 已知:A / B = C ······ R  (A.B.C.R皆是整数) 假设:D是A的余数,D也是B的余数,那么D就是A和B的公约数 D是A和B的约数,则A和B是 ...

  9. [LeetCode] H-Index II 求H指数之二

    Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize ...

随机推荐

  1. PHP文件上传主要代码讲解

    导读:在php开发过程中,文件上传也经常用到,这里简单介绍下. 在php开发过程中,文件上传也经常用到,这里简单介绍下. 代码如下: <?php    if($_FILES['myfile'][ ...

  2. delphi中panel控件应用

    delphi中的panel控件是怎么使用的?研究了很久了,还是搞不懂,只知道把它放到form上面,其他操作一律不懂了,有谁可以请教一下,如何把其他控件放到里面去呢?谢谢 提问者采纳   直接把控件放到 ...

  3. Delphi实例之一个较复杂的记事本的实现

    http://www.mamicode.com/info-detail-110813.html delphi中控件位置及自动排版的问题 http://blog.csdn.net/avan_lau/ar ...

  4. php中二维数组如何使用

    最近需要使用PHP中的二维数组,就用一个简单的例子来说明PHP中二数组是如何使用 <?php $a=array('a','b','c'); $c=array('a1','b1','c1'); $ ...

  5. 阿里云服务器windows系统C盘一键清理脚本

    @ECHO OFF @echo @echo @echo 清理几个比较多垃圾文件的地方 DEL /F /S /Q "C:\WINDOWS\PCHealth\ERRORREP\QSIGNOFF\ ...

  6. 负载均衡软件LVS分析四(测试)

    一.启动LVS集群服务LVS负载均衡管理和使用有两种方式,一种是以ipvsadm命令行脚步与ldirectord监控方式,一种是以Piranha工具进行管理和使用.下面分别介绍. 1.利用ipvsad ...

  7. [PCB设计] 4、BAT脚本处理AD生成的GERBER文件为生产文件

    1.生产资料概述 为了资料保密和传输方便,交给PCB厂商打样的资料一般以Gerber和钻孔文件为主,换句话说,只要有前面说的两种文件,就能制作出你想要的PCB了. 一般来说,交给PCB厂商的Gerbe ...

  8. Jsoup后台解析html、jsp网页

    在一些网络爬虫或者从第三方网站抓取信息的程序都面临1个问题,如何从网页中把所需的信息提取出来,Jsoup是个比较好的选择,它能把网站内容解析成Document,再从document中取element就 ...

  9. css3 UI 修饰——回顾

    1.box-shadow 属性向框添加一个或者多个阴影. 语法: box-shadow: h-shadow v-shadow blur spread color inset h-shadow 必须,水 ...

  10. iOS Storyboard适配问题

      通用的Storyboard 通用的stroyboard文件是通向自适应布局光明大道的第一步.在一个storyboard文件中适配iPad和iPhone的布局在iOS8中已不再是梦想.我们不必再为不 ...