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


    辗转相除法,一种求最大公约数的算法

    已知:A / B = C ······ R  (A、B、C、R皆是整数)

    假设:D是A的余数,D也是B的余数,那么D就是A和B的公约数

    D是A和B的约数,则A和B是D的倍数,B * C也是D的倍数

    既然A与B*C都是D的倍数,那么A与B*C的也是D的倍数

    A - B*C = R

    所以R也是D的倍数

    如果D是A或B的公约数,那么D也是B和R的公约数

    故:(A,B)= (B,R)

    由以上证明则可以求出最大的公约数

    例如:求72和28的最大公约数

    72 / 28 = 2 ······ 16

    ↓      ↓      ↓          ↓

    28 / 16 = 1 ······ 12

    ↓      ↓      ↓          ↓

    16 / 12 = 1 ······ 4

    ↓      ↓      ↓         ↓

    12 / 4  =  3  ······ 0

    现在可以知道 72与28的最大公约数是4

     1 #include <stdio.h> 
     2 int main(){
     3     int a;                    // 除数
     4     int b;                    // 被除数
     5     int r=1;                 // 余数,赋初值为1 
     6     printf("输入除数与被除数(空格分开):");
     7     scanf("%d %d",&a,&b);
     8     while(r!=0){             // 如果a<b,亦无需颠倒ab,在计算中商0余除数本身,在下次运算中自可颠倒回来 
     9         r = a % b;
    10         a = b;
    11         b = r;
    12     }
    13     printf("最大公约数为:%d
    ",a);        // 此时b的值已经在a中了,所以输出的a就是最大公约数 
    14     return 0;
    15 }

    永远年轻,永远热泪盈眶,永远怀抱希望,永远相信美好的事情即将发生。
  • 相关阅读:
    影子的宽度&&盒子的个数
    【NOIP2017】【洛谷3958】奶酪cheese(并查集)(dfs)
    【USACO Jan 2011】【洛谷P3008】道路和航线 Roads and Planes
    增肥计划
    【洛谷1379】八数码
    【洛谷1985】【USACO07OPEN】翻转棋
    【NOI1995】极值问题
    车的放置
    【AtCoder
    Design Tutorial: Inverse the Problem
  • 原文地址:https://www.cnblogs.com/zxkwdw/p/11986695.html
Copyright © 2020-2023  润新知