求两个整数的最大公约数
来源:互联网 发布:叉烧 知乎 编辑:程序博客网 时间:2024/05/14 13:47
题目要求
从键盘输入两个整数,输出两个整数的最大公约数和最小公倍数。用C或C++语言实现程序解决问题。最大公约数:指两个或多个整数共有约数中最大的一个。求最大公约数有多种方法,常见的有辗转相除法,相减法,穷举法,Stein算法。最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数。
分析
求最小公倍数算法:最小公倍数=两整数的乘积÷最大公约数
求最大公约数算法:如下
方法一:相减法
算法思想:
① 若a大于b,则a=a-b,
② 若a小于b,则b=b-a
③ 若a等于b,则a(或b)即为两数的最大公约数
④ 若a不等于b,则再回去执行①
⑤也就是说循环的判断条件为a != b ,直到a = b时,循环结束。
举例说明:
24和15的最大公约数过程为:
a=24,b=15
a>b 则 a = a - b = 24 - 15 = 9,b = 15
b>a 则 b = b-a = 15 - 9 = 6,a = 9
a>b 则 a = a - b = 9 - 6= 3,b=3
循环结束。
流程图:
代码展示:
#include<stdio.h>int main(){ int m, n, a, b; while (1) { printf("使用相减法求算\n"); printf("请输入两个整数,如(7 24):\n\t"); // a, b不相等,大数减小数,直到相等为止 scanf_s("%d%d", &a, &b); m = a; n = b; if (a <= 0 || b <= 0) { printf("输入有误,请重新输入:\n\t"); scanf_s("%d%d", &a, &b); m = a; n = b; } while (a != b) { if (a > b) a = a - b; else b = b - a; } printf("用相减法求得两数 最大公约数为:%d\n", a); printf("\n\t\t 最小公倍数为:%d\n", m*n / a); } return 0;}
运行结果展示:
方法二:穷举法
算法思想:
①选出a,b中最小的一个数字放到c中
②分别用a,b对c求余数,即看是否能被c整除
③直到a,b同时都能被c整除
④如不能整除,c- - (c的值减一) 继续从2开始执行
⑤也就是说该循环的判断条件为 a,b能否同时被c整除,只要有一个数不能被c整除,循环继续执行
举例说明:
9和4的最大公约数过程为:
a = 9,b = 4
将其中最小的数字赋予c,c =4
a%c = 1 ,b%c = 0 ,a,b不能同时被c整除,循环继续c– ,c = 3
a%c = 0 ,b%c = 1 ,a,b不能同时被c整除,循环继续c– ,c = 2
a%c = 1 ,b%c = 0 ,a,b不能同时被c整除,循环继续c– ,c = 1
a%c = 0 ,b%c = 0 ,a,b同时被c整除 ,循环结束。
c是a和b的最大公约数。
流程图:
代码展示:
#include<stdio.h>int main(){ int m, n, a, b, c; while (1) { printf("使用穷举法法求算\n"); printf("请输入两个整数,如(7 24):\n\t"); scanf_s("%d%d", &a, &b); if (a <= 0 || b <= 0) { printf("输入有误,请重新输入:\n\t"); scanf_s("%d%d", &a, &b); } c = (a > b) ? b : a; //三目运算符,求出两数中最小值,赋给c m = a; n = b; while (a%c != 0 || b%c != 0) //找到一个数能同时被啊a,b整除,则中止循环 { c--; //如果不满足条件,则变量自减,直到能被a,b整除 } printf("用穷举法求得两数最大公约数为:%d\n", c); printf("\n\t\t最小公倍数为:%d\n", m*n / c); } return 0;}
运行结果展示:
方法三:辗转相除法
算法思想:
有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①
④该循环的是否继续的判断条件就是c是否为0
举例说明:
求24和15的最大公约数过程为:
a=24,b=15
24÷15 余9,15÷9余6,9÷6余3,3÷3余0,因此,3即为最大公约数
流程图:
代码展示:
#include<stdio.h>int main(){ int m, n, a, b, c; while (1) { printf("使用辗转相除法求算\n"); printf("请输入两个整数,如(7 24):\n\t"); scanf_s("%d%d", &a, &b); m = a; n = b; if (a <= 0 || b <= 0) { printf("输入有误,请重新输入:\n\t"); scanf_s("%d%d", &a, &b); m = a; n = b; } while (b != 0) //余数不为0,继续相除,直到余数为0 { c = a%b; a = b; b = c; } printf("用辗转相除法求得 最大公约数为:%d\n", a); printf("\n\t\t 最小公倍数为:%d\n", m*n / a); } return 0;}
运行结果展示:
源代码:
#include <stdio.h> #include<stdlib.h>void first();void second();void third();void menu();void exit();int main(){ int k; k = 1; while (k) { menu(); } system("pause"); return 0;}//用相减法求最大公约数和最小公倍数void first(){ int m, n, a, b; printf("使用相减法求算\n"); printf("请输入两个整数,如(7 24):\n\t"); // a, b不相等,大数减小数,直到相等为止 scanf_s("%d%d", &a, &b); m = a; n = b; if (a <= 0 || b <= 0) { printf("输入有误,请重新输入:\n\t"); scanf_s("%d%d", &a, &b); m = a; n = b; } while (a != b) { if (a > b) a = a - b; else b = b - a; } printf("用相减法求得两数 最大公约数为:%d\n", a); printf("\n\t\t 最小公倍数为:%d\n", m*n / a);}//用穷举法求最大公约数void second(){ int m, n, a, b, c; printf("使用穷举法法求算\n"); printf("请输入两个整数,如(7 24):\n\t"); scanf_s("%d%d", &a, &b); if (a <= 0 || b <= 0) { printf("输入有误,请重新输入:\n\t"); scanf_s("%d%d", &a, &b); } c = (a > b) ? b : a; //三目运算符,求出两数中最小值,赋给c m = a; n = b; while (a%c != 0 || b%c != 0) //a,b同时能被c整除 不执行该循环 { c--; //如果不满足条件,则变量自减,直到能被a,b整除 } printf("用穷举法求得两数最大公约数为:%d\n", c); printf("\n\t\t最小公倍数为:%d\n", m*n / c);}//用辗转相除法求最大公约数和最小公倍数void third(){ int m, n, a, b, c; printf("使用辗转相除法求算\n"); printf("请输入两个整数,如(7 24):\n\t"); scanf_s("%d%d", &a, &b); m = a; n = b; if (a <= 0 || b <= 0) { printf("输入有误,请重新输入:\n\t"); scanf_s("%d%d", &a, &b); m = a; n = b; } while (b != 0) /* 余数不为0,继续相除,直到余数为0 */ { c = a%b; a = b; b = c; } printf("用辗转相除法求得 最大公约数为:%d\n", a); printf("\n\t\t 最小公倍数为:%d\n", m*n / a);}void menu() //主界面{ int num; printf(" \n\t************************************************** \n"); printf(" * 求两数最大公约数和最小公倍数的三种算法 * "); printf(" \n\t**************************************************\n\n"); printf(" ---------------------- ---------------------- \n"); printf(" * 1.相减法 \n\n"); printf(" * 2.穷举法 \n\n"); printf(" * 3.辗转相除法 \n\n"); printf(" * 4.退出计算 \n"); printf(" ---------------------- ---------------------- \n\n"); printf("请选择编号1—4:"); scanf_s("%d", &num); switch (num) { case 1:first(); break; case 2:second(); break; case 3:third(); break; case 4:exit(); break; default:printf("\n\n\t\t输入错误,请在1—4之间选择\n"); }}void exit(){ printf("\n\t确定退出系统请直接按回车,否则继续在1—3中选择返回主菜单"); getchar(); if (getchar() == '\n') { printf("谢谢使用"); exit(0); } else { menu(); }}
运行结果展示:
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数的最大公约数
- 求两个整数最大公约数
- 求两个整数的最大公约数的程序
- 求两个整数的最大公约数和最小公倍数
- createrepo常用参数
- STM32项目笔记之SPI3
- java,System.out.println(t…
- 算法基础5:希尔排序(缩减增量排序算法)
- eclipse内容辅助
- 求两个整数的最大公约数
- Android中AndroidManifest.x…
- android中dip、px相互换算
- android:TableLayout表格布…
- Android 自带图标库 and…
- Android:Layout_weight的深刻理解
- HC-05与安卓通信数据丢失问题解决
- Redis数据类型以及常用命令大全
- Android : 线程的结束,挂起…