求两个数的最大公约数的三种方法:

一、 穷举法:

分析:因为最大公约数必小于等于这两个数中的较小数,故先取两个数中较小的值 t 作为起始值开始判断,满足后直接输出并结束,不满足则继续判断 t- -,直至找到最大公约数为止!

void Greatest_common_divisor1(int a, int b)//穷举法
{if (a == 0 || b == 0)//0没有最大公约数{printf("\"0\"没有最大公约数!\n");//\" \"是为了输出",不懂的童鞋可以查查转义字符。return;}a = abs(a);//取绝对值,防止a或b为负对结果造成错误影响b = abs(b);int t;t = a < b ? a : b;//最大公约数一定小于两个数中的较小数,故在此将较小值赋给t.//for (int i = t; i>0; i--)//{//    if ((a%i == 0) && (b%i == 0))//当i同时整除a,b时,此时i为最大公约数//   {//     printf("%d\n", i);//      break;//    }//}while ((a%t != 0) || (b%t != 0)){t--;}printf("%d\n", t);//与上述for循环功能一致,取一即可
}

二、【欧几里得算法】辗转相除法

分析:每个步骤都可以表示为m=n*C+r的形式,而经过每一个步骤,n 移到 m 的位置,r 移到 n 的位置。当m%n!=0时,执行上述步骤; 直至当r=m%n==0时,求得gcd=n;
目前,欧几里得开发的此算法是求最大公约数方法中被公认为效率最高的一种。

void Greatest_common_divisor2(int a, int b)//辗转相除法
{if (a == 0 || b == 0)//0没有最大公约数{printf("\"0\"没有最大公约数!\n");//\" \"是为了输出",不懂的童鞋可以查查转义字符。return;}a = abs(a);//取绝对值,防止a或b为负对结果造成错误影响b = abs(b);if (a < b){swap(&a, &b);}while (b>0){int t = a%b;//不能直接把a%b赋给b(b=a%b),因为b的值在下一步要赋给a,如果现在就把a%b赋给b会将b的值覆盖掉导致下一步出错。引入t来解决这一问题a = b;b = t;}printf("%d\n", a);
}

三、 辗转相减法

分析:判断两数的大小,取较大值和较小值的差并赋给较大值,直至两值相等,即相等的值即为最大公约数

void Greatest_common_divisor3(int a, int b)//辗转相减法
{if (a == 0 || b == 0)//0没有最大公约数{printf("\"0\"没有最大公约数!\n");//\" \"是为了输出",不懂的童鞋可以查查转义字符。return;}a = abs(a);//取绝对值,防止a或b为负对结果造成错误影响b = abs(b);while (a != b)//当a和b相等时{if (a>b){a = a - b;}else{b = b - a;}}printf("%d\n", b);
}

整体代码:

/*    求最大公约数的三种方法:运行环境:vs2013    */
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void swap(int *x, int*y);
void Greatest_common_divisor1();
void Greatest_common_divisor2();
void Greatest_common_divisor3();
int main()
{int a, b,s;while (1){printf("请输入a,b的值:");scanf("%d%d", &a, &b);if (a == 0 || b == 0)//0没有最大公约数{printf("\"0\"没有最大公约数!\n");//   \" \"是为了输出"0"的效果,不懂的童鞋可以查查转义字符。continue;}printf("1.使用穷举法求最大公约数;\n");printf("2.使用辗转相除法法求最大公约数;\n");printf("3.使用辗转相减法求最大公约数;\n");scanf("%d",&s);switch (s){case 1:Greatest_common_divisor1(a, b);break;case 2:Greatest_common_divisor2(a, b);break;case 3:Greatest_common_divisor3(a, b);break;default:printf("输入有误!");}system("pause");system("cls");}return 0;
}
void Greatest_common_divisor1(int a, int b)//穷举法
{a = abs(a);//取绝对值,防止a或b为负对结果造成错误影响b = abs(b);int t;t = a < b ? a : b;//最大公约数一定小于两个数中的较小数,故在此将较小值赋给t.while ((a%t != 0) || (b%t != 0)){t--;}printf("%d\n", t);
}
void Greatest_common_divisor2(int a, int b)//辗转相除法
{a = abs(a);//取绝对值,防止a或b为负对结果造成错误影响b = abs(b);if (a < b){swap(&a, &b);}int t=1;//随便给t一个大于0的值while (t>0){t = a%b;//不能直接把a%b赋给b(b=a%b),因为b的值在下一步要赋给a,如果现在就把a%b赋给b会将b的值覆盖掉导致下一步出错。引入t来解决这一问题a = b;b = t;}printf("%d\n", a);
} void swap(int *x, int*y)
//通过指针改变原地址内存储的值,当该函数结束.栈帧释放时实现该函数的改值操作仍有效。
{int t = *x;*x = *y;*y = t;
}
void Greatest_common_divisor3(int a, int b)//辗转相减法
{a = abs(a);//取绝对值,防止a或b为负对结果造成错误影响b = abs(b);while (a != b)//当a和b相等时{if (a>b){a = a - b;}else{b = b - a;}}printf("%d\n", b);
}

说完三种方法,再思考一下当求多个数的最大公约数时,该如何处理:

递归法:

分析思路:该gcd应该先求前两个数的gcd,然后再将gcd和下一个数求gcd和这个数的gcd,听起来有点绕口,简言之就是不断用gcd和后面的数进行求公约数运算,直至进行到最后一个数得到的gcd便是这组数的gcd;(作者简称最大公约数:gcd)
注:求两个数的最大公约数以上介绍了三种方法,此处选择最靠谱的辗转相除法。
代码实现如下:

//求最大公约数进阶:求多个数的最大公约数。
#include<stdio.h>
#define max 4//一共求max个数的最大公约数
void set_array();
void print_array();
void swap(int *x, int *y);
int Greatest_common_divisor(int a, int b);
int main()
{int a[max] = { 0 };set_array(a);print_array(a);int gcd=Greatest_common_divisor(a[0],a[1]);for (int i =2; i < max; i++){gcd = Greatest_common_divisor(gcd, a[i]);//每次使gcd和后面的数求最大公约数}printf("该%d个数的共同最大公约数为:%d\n", max, gcd);return 0;
}
int Greatest_common_divisor(int a, int b)
{if (a < b){swap(&a, &b);}a = abs(a);b = abs(b);while (b){int t = a%b;a = b;b = t;}return a;
}
void swap(int *x, int *y)
{int t = *x;*x = *y;*y = t;
}
void set_array(int p[])
{for (int i = 0; i < max; i++){scanf("%d", &p[i]);}
}
void print_array(int *p)
{for (int i = 0; i < max; i++){printf("%d\t", p[i]);}
}

穷举法:

分析:一组数的最大公倍数肯定小于这组数的最小数,然后从这个最小数开始穷举,每次判断这组数是否可以全部整除这个数,若可以,则该数为这组数的最大公约数;否则,继续穷举;知道找到为止。
代码实现:

#include<stdio.h>
#include<stdbool.h>
#include<math.h>
#define max 4
void set_array();//初始化数组
void print_array();//输出数组
int Min_Num(int *p);//返回数组中的最小数
bool Determine_divisible(int *p, int n);//判断n是否可以整除*p中所有数
int main()
{int a[max] = { 0 };set_array(a);print_array(a);int min = Min_Num(a);for (int i = min; i > 0; i--){if (Determine_divisible(a, i)){printf("\n这几个数的最小公约数:%d\n", i);break;}}for (int i = a[0]; i > 0; i--)//此处i的初始值不同,相比与上一个循环可以不用Min_Num()函数的辅助,省去求最小值的时间。/*给i赋这组数中任意值,若改值可以被其他数整除,故该数为最大公倍数(这种情况只存在于所给数恰好为最小数,且该数可以整除其余数)否则递减,直到满足所有数都可被i整除   */{if (Determine_divisible(a, i)){printf("这几个数的最小公约数:%d\n", i);break;}}return 0;
}
void set_array(int p[])
{for (int i = 0; i < max; i++){scanf("%d", &p[i]);}
}
void print_array(int *p)
{for (int i = 0; i < max; i++){printf("%d\t", p[i]);}
}
int Min_Num(int *p)
{int t = p[0];for (int i = 1; i < max; i++){t = p[i]>t ? t : p[i];}return t;
}
bool Determine_divisible(int *p, int n)
{for (int i = 0; i < max; i++){if (p[i] % n != 0){return false;}}return true;
}

求最大公约数及求多个数的最大公约数相关推荐

  1. 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数

    第二次作业 题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整 ...

  2. java程序:求三个数的最大公约数和最小公倍数

    import java.util.ArrayList; import java.util.List; import java.util.Scanner; /**main方法用于测试结果**/publi ...

  3. c语言求两个数的最小公倍数辗转相除法,C语言辗转相除法求2个数的最小公约数...

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

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

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

  5. 求三个数的最大公约数和最小公倍数

    题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整数最大公约数 ...

  6. [华为机试练习题]55.最大公约数 amp; 多个数的最大公约数

    题目 描写叙述: 输入2个数字,最后输出2个数字的最大公约数 题目类别: 位运算 难度: 0基础 执行时间限制: 无限制 内存限制: 无限制 阶段: 入职前练习 输入: 2个整数 输出: 输出数字1和 ...

  7. ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数

    题目描述 写两个函数,分别求两个整数的最大公约数和最小公倍数, 用主函数调用这两个函数,并输出结果两个整数由键盘输入. 输入 两个数 输出 最大公约数 最小公倍数 样例输入 6 15 样例输出 3 3 ...

  8. 辗转相除法是求两个数的最大公约数的方法。

    题目: /*      第五题 辗转相除法是求两个数的最大公约数的方法. */ 代码部分: #include<iostream> using namespace std;int x; in ...

  9. python编写函数、计算三个数的最大公约数_python 函数求两个数的最大公约数和最小公倍数...

    1. 求最小公倍数的算法: 最小公倍数 = 两个整数的乘积 / 最大公约数 所以我们首先要求出两个整数的最大公约数, 求两个数的最大公约数思路如下: 2. 求最大公约数算法: 1. 整数A对整数B进行 ...

  10. 百度web前端面试题之求两个数的最大公约数和最小公倍数

    求两个数的最大公约数和最小公倍数,好像是第三题, 找到如下简洁写法: <1> 用辗转相除法求最大公约数 算法描述: m对n求余传给自己,再次求余, 若余数等于0 则 n 为最大公约数 &l ...

最新文章

  1. 卷积神经网络的体系结构
  2. javascript中五句话
  3. EL表达式取 Map、 List和数组的值
  4. [项目回顾]基于Annotation与SpringAOP的缓存简单解决方案
  5. 亚马逊加入微软Facebook框架联盟,抱团挑战TensorFlow霸权?
  6. iis7 30M突破
  7. 前端分页插件pagination
  8. 【sklearn第二十八讲】验证曲线
  9. 论文笔记_S2D.33_2015-ICCV_使用单个多尺度卷积网络,预测深度、表面法线和语义标签
  10. antd vue form 手动校验_vue测试模板与jsonSchema自动生成elment组件
  11. 计算机桌面图标被挡怎么办,win7电脑桌面图标被挡住怎么恢复 - 卡饭网
  12. ROS下使用摄像头进行机器人巡线功能(附带功能包链接)
  13. 样本不均衡 Weighted cross entropy and Focal loss
  14. 【动态系统的建模与分析】一阶系统的单位阶跃响应+时间常数-笔记
  15. 一个网站的pv代表什么?
  16. 使用 easyExcel 生成多个 excel 并打包成zip压缩包
  17. 深入了解passive-interface
  18. 12306自动抢票及自动识别验证码功能(二)
  19. ESP32与STM32的SPI半双工通信与握手协议讲解(附代码)
  20. 【行为管理篇】01. 恢复出厂及登录 ❀ 深信服上网行为管理

热门文章

  1. python 数学公式_python的数学算法函数及公式用法
  2. tcp的finrst flood攻击与防御
  3. win10麦克风权限无法开启
  4. 手写数字识别案例、手写数字图片处理
  5. UOJ #311「UNR #2」积劳成疾
  6. linux 符号所在库,linux - 未定义的符号引用,即使nm表示此符号存在于共享库中 - 堆栈内存溢出...
  7. 竞赛复盘(1)- CCF BDCI 2019 互联网新闻情感分析
  8. 使用freesurfer和3Dslicer进行脑区分割和电极定点(日常记录)
  9. python实现pdf转png(转载)
  10. 通用产品 云OA SaaS三管齐下