C语言求最大公约数最小公倍数(多种方法)
前言
- 这个求解方式多样化,灵活变动,但是,网上没有很好的资源和很全的代码,特此练习,敲打后,总结成本片文章.
单一求解
一.最大公约数
1.穷举法(最简单求解方式)
- 利用除法方式用当前的数字不断去除以比较小的那个数的范围,最后得到两个数都可以整除的那个数.(这种方法也是最容易想到的)
核心代码
// 用比较小的一个数作为循环范围,然后不断减少,以便求出最后的公约数
void getResult(int a, int b, int min)
{
for (int i = min; i > 1; i--)
{
if (a%i == 0 && b%i == 0)
{
printf("%d %d的最大公约数是:%d\n", a, b, i);
}
}
}
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
// 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include <stdlib.h>
void maxCommonNumber();
void getResult(int a, int b, int min);
int main()
{
maxCommonNumber();
system("pause");
return 0;
}
void maxCommonNumber() {
int a = 0;
int b = 0;
int result = 0;
printf("请输入两个数:\n");
printf("请输入第一个数a:");
scanf("%d", &a);
printf("请输入第二个数b:");
scanf("%d", &b);
if (a > b)
{
getResult(a, b, b);
}
else {
getResult(a, b,a);
}
}
// 用比较小的一个数作为循环范围,然后不断减少,以便求出最后的公约数
void getResult(int a, int b, int min)
{
for (int i = min; i > 1; i--)
{
if (a%i == 0 && b%i == 0)
{
printf("%d %d的最大公约数是:%d\n", a, b, i);
}
}
}
- 优化算法
#define _CRT_SECURE_NO_WARNINGS 1
// 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include <stdlib.h>
void maxCommonNumber();
void getResult(int a, int b, int min);
int main()
{
maxCommonNumber();
system("pause");
return 0;
}
void maxCommonNumber() {
int a = 0;
int b = 0;
int result = 0;
printf("请输入两个数:\n");
printf("请输入第一个数a:");
scanf("%d", &a);
printf("请输入第二个数b:");
scanf("%d", &b);
if (a > b)
{
getResult(a, b, b);
}
else {
getResult(a, b,a);
}
}
// 优化算法
void getResult(int a, int b, int min) {
int temp = 0;
// 接收最小的值,对这个值进行操作,因为没用指针,所以这里用变量接收值修改
temp = min;
while (temp > 0)
{
if (a%temp == 0 && b%temp == 0)
{
break;
}
temp--;
}
printf("[%d %d]的最大公约数是:%d\n", a, b, temp);
}
2.递减法操作
- 通过不断的相减获取最大公约数.
核心代码
// 优化算法
void getResult(int a, int b, int min) {
int temp_A = 0;
int temp_B = 0;
// 接收最小的值,对这个值进行操作,因为没用指针,所以这里用变量接收值修改
temp_A = a;
temp_B = b;
while (temp_A != temp_B)
{
if (temp_A > temp_B)
{
temp_A = temp_A - temp_B;
}
else
{
temp_B = temp_B - temp_A;
}
}
printf("[%d %d]的最大公约数是:%d\n", a, b, temp_A);
}
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
// 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include <stdlib.h>
void maxCommonNumber();
void getResult(int a, int b, int min);
int main()
{
maxCommonNumber();
system("pause");
return 0;
}
void maxCommonNumber() {
int a = 0;
int b = 0;
int result = 0;
printf("请输入两个数:\n");
printf("请输入第一个数a:");
scanf("%d", &a);
printf("请输入第二个数b:");
scanf("%d", &b);
if (a > b)
{
getResult(a, b, b);
}
else {
getResult(a, b,a);
}
}
// 优化算法
void getResult(int a, int b, int min) {
int temp_A = 0;
int temp_B = 0;
// 接收最小的值,对这个值进行操作,因为没用指针,所以这里用变量接收值修改
temp_A = a;
temp_B = b;
while (temp_A != temp_B)
{
if (temp_A > temp_B)
{
temp_A = temp_A - temp_B;
}
else
{
temp_B = temp_B - temp_A;
}
}
printf("[%d %d]的最大公约数是:%d\n", a, b, temp_A);
}
3.辗转相除法
- 不断的让两个数做除法运算。其原理基于两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数
核心代码
// 优化算法
void getResult(int a, int b, int min) {
int temp = 0;
int temp_A = 0;
int temp_B = 0;
// 接收最小的值,对这个值进行操作,因为没用指针,所以这里用变量接收值修改
temp_A = a;
temp_B = b;
while (temp_B != 0) // 余数不为0,继续相除,直到余数为0
{
temp = temp_A % temp_B;
temp_A = temp_B;
temp_B = temp;
}
printf("[%d %d]的最大公约数是:%d\n", a, b, temp_A);
}
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
// 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include <stdlib.h>
void maxCommonNumber();
void getResult(int a, int b, int min);
int main()
{
maxCommonNumber();
system("pause");
return 0;
}
void maxCommonNumber() {
int a = 0;
int b = 0;
int result = 0;
printf("请输入两个数:\n");
printf("请输入第一个数a:");
scanf("%d", &a);
printf("请输入第二个数b:");
scanf("%d", &b);
if (a > b)
{
getResult(a, b, b);
}
else {
getResult(a, b,a);
}
}
// 优化算法
void getResult(int a, int b, int min) {
int temp = 0;
int temp_A = 0;
int temp_B = 0;
// 接收最小的值,对这个值进行操作,因为没用指针,所以这里用变量接收值修改
temp_A = a;
temp_B = b;
while (temp_B != 0) // 余数不为0,继续相除,直到余数为0
{
temp = temp_A % temp_B;
temp_A = temp_B;
temp_B = temp;
}
printf("[%d %d]的最大公约数是:%d\n", a, b, temp_A);
}
4.递归法
核心代码
int gcd1(int x, int y) {
int temp = x % y;
if (temp == 0)
{
return y;
}
else
{
return(y, temp);
}
}
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
// 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include <stdlib.h>
void maxCommonNumber();
void getResult(int a, int b);
int gcd1(int x, int y);
int main()
{
maxCommonNumber();
system("pause");
return 0;
}
void maxCommonNumber() {
int a = 0;
int b = 0;
int result = 0;
printf("请输入两个数:\n");
printf("请输入第一个数a:");
scanf("%d", &a);
printf("请输入第二个数b:");
scanf("%d", &b);
if (a > b)
{
getResult(a, b, b);
}
else {
getResult(a, b,a);
}
}
// 优化算法
void getResult(int a, int b) {
int result = gcd1(a, b);
printf("[%d %d]的最大公约数是:%d\n", a, b, result);
}
int gcd1(int x, int y) {
int temp = x % y;
if (temp == 0)
{
return y;
}
else
{
return(y, temp);
}
}
5.位运算法
核心代码
int gcd(int x, int y) {
// 交换x和y的值,然后进行y/x运算
while (x ^= y ^= x ^= y %= x);
return y;
}
- 其中
x ^= y ^= x ^= y %= x
- 翻译为
假设 x=2;y=1;
拆分为:
x ^= y ^= x ^= y %= x
// 交换x和y的数字(这样就把x=2;y=1;变为x=2;y=1;)
x^=y; // x = x ^ y;x的y次方 => x = 2 ^ 1; => x=2;
y^=x; // x = x ^ y;x的y次方 => y = 1 ^ 2; => y=1;
x^=y; // x = x ^ y;x的y次方 => x = 2 ^ 1; => x=2;
// y对x取模
y%=x; // y = y % x; y除以x的余数 => y = 1%2 => y=2;
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
// 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include <stdlib.h>
void maxCommonNumber();
void getResult(int a, int b);
int gcd1(int x, int y);
int main()
{
maxCommonNumber();
system("pause");
return 0;
}
void maxCommonNumber() {
int a = 0;
int b = 0;
int result = 0;
printf("请输入两个数:\n");
printf("请输入第一个数a:");
scanf("%d", &a);
printf("请输入第二个数b:");
scanf("%d", &b);
if (a > b)
{
getResult(a, b, b);
}
else {
getResult(a, b,a);
}
}
// 优化算法
void getResult(int a, int b) {
int result = gcd1(a, b);
printf("[%d %d]的最大公约数是:%d\n", a, b, result);
}
int gcd1(int x, int y) {
// 交换x和y的值,然后进行y/x运算
while (x ^= y ^= x ^= y %= x);
return y;
}
二.最小公倍数
1.穷举法
核心代码
void getResult(int a, int b,int max) {
int temp = 0;
for (int i = max; i <= (a*b); i++)
{
if (i%a == 0 && i%b == 0)
{
temp = i;
break;
}
}
printf("[%d %d]的最小公倍数是:%d\n", a, b, temp);
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
// 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include <stdlib.h>
void maxCommonNumber();
void getResult(int a, int b, int max);
int main()
{
maxCommonNumber();
system("pause");
return 0;
}
void maxCommonNumber() {
int a = 0;
int b = 0;
int result = 0;
printf("请输入两个数:\n");
printf("请输入第一个数a:");
scanf("%d", &a);
printf("请输入第二个数b:");
scanf("%d", &b);
if (a > b)
{
getResult(a, b, a);
}
else {
getResult(a, b,b);
}
}
// 优化算法
void getResult(int a, int b,int max) {
int temp = 0;
for (int i = max; i <= (a*b); i++)
{
if (i%a == 0 && i%b == 0)
{
temp = i;
break;
}
}
printf("[%d %d]的最小公倍数是:%d\n", a, b, temp);
}
2.辗转相除法
核心代码
// 优化算法
void getResult(int a, int b) {
// 用于自增的变量
int temp = 0;
// 接收最小公倍数最后的结果
int gongbei = 0;
// ===== 没有使用指针,所以,采用用变量接收修改参数值的方法 ******
temp = a;
// 获取两个数中较大的一个
gongbei = a;
while (1)
{
// 两个数中较大的数除以较小的数,能除开就说明最大的数就是两个数的最小公倍数
if (gongbei%b == 0) {
break;
}
// 较大的数除不开较小的数,最大的数就再加一个自己再循环除第二个数
// 累加获得最小公倍数
gongbei += temp;
}
printf("[%d %d]的最小公倍数是:%d\n", a, b, gongbei);
}
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
// 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include <stdlib.h>
void maxCommonNumber();
void getResult(int a, int b);
int main()
{
maxCommonNumber();
system("pause");
return 0;
}
void maxCommonNumber() {
int a = 0;
int b = 0;
int result = 0;
printf("请输入两个数:\n");
printf("请输入第一个数a:");
scanf("%d", &a);
printf("请输入第二个数b:");
scanf("%d", &b);
if (a > b)
{
getResult(a, b);
}
else {
getResult(a, b);
}
}
// 优化算法
void getResult(int a, int b) {
// 用于自增的变量
int temp = 0;
// 接收最小公倍数最后的结果
int gongbei = 0;
// ===== 没有使用指针,所以,采用用变量接收修改参数值的方法 ******
temp = a;
// 获取两个数中较大的一个
gongbei = a;
while (1)
{
// 两个数中较大的数除以较小的数,能除开就说明最大的数就是两个数的最小公倍数
if (gongbei%b == 0) {
break;
}
// 较大的数除不开较小的数,最大的数就再加一个自己再循环除第二个数
// 累加获得最小公倍数
gongbei += temp;
}
printf("[%d %d]的最小公倍数是:%d\n", a, b, gongbei);
}
3.通过公约数获取
核心代码
int function_my(int x, int y) {
return x * y / gcd1(x, y);
}
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
// 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include <stdlib.h>
void maxCommonNumber();
void getResult(int a, int b);
int gcd1(int x, int y);
int function_my(int x, int y);
int main()
{
maxCommonNumber();
system("pause");
return 0;
}
void maxCommonNumber() {
int a = 0;
int b = 0;
int result = 0;
printf("请输入两个数:\n");
printf("请输入第一个数a:");
scanf("%d", &a);
printf("请输入第二个数b:");
scanf("%d", &b);
if (a > b)
{
getResult(a, b);
}
else {
getResult(a, b);
}
}
// 优化算法
void getResult(int a, int b) {
int result = function_my(a, b);
printf("[%d %d]的最小公倍数是:%d\n", a, b, result);
}
int gcd1(int x, int y) {
// 交换x和y的值,然后进行y/x运算
while (x ^= y ^= x ^= y %= x);
return y;
}
int function_my(int x, int y) {
return x * y / gcd1(x, y);
}
合并求解
最大公约和最小公倍一起求
#define _CRT_SECURE_NO_WARNINGS 1
// 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include <stdlib.h>
void maxCommonNumber();
void getResult(int a, int b);
int gcd1(int x, int y);
int function_my(int x, int y);
int main()
{
maxCommonNumber();
system("pause");
return 0;
}
void maxCommonNumber() {
int a = 0;
int b = 0;
int result = 0;
printf("请输入两个数:\n");
printf("请输入第一个数a:");
scanf("%d", &a);
printf("请输入第二个数b:");
scanf("%d", &b);
getResult(a, b);
}
// 结果
void getResult(int a, int b) {
int yue = gcd1(a, b);
printf("[%d %d]最大公约数:%d\n", a, b, yue);
int bei = function_my(a, b);
printf("[%d %d]最小公倍数:%d\n", a, b, bei);
}
int gcd1(int x, int y) {
// 交换x和y的值,然后进行y/x运算
while (x ^= y ^= x ^= y %= x);
return y;
}
int function_my(int x, int y) {
return x * y / gcd1(x, y);
}
C语言求最大公约数最小公倍数(多种方法)的更多相关文章
- c语言求最大公约数和最小公倍数
求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因 ...
- c语言求最大公约数和最小公倍数(转)
最大公约数与最小公倍数的求解是很多初学C的人所面临的一道问题.当然这道问题并不难解答,也有很多人已经写过相关的博客,我在此书写此篇博客,一是为了让自己能够夯实基础,另外就是希望能够帮到和我一样的初学者 ...
- C语言 · 求最大公约数
算法提高 求最大公约数 时间限制:1.0s 内存限制:512.0MB 编写一函数gcd,求两个正整数的最大公约数. 样例输入: 5 15样例输出:5 样例输入: 7 2样例输出:1 ...
- c语言求最大公约数
求差判定法. 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60 ...
- Java求最大公约数和最小公倍数
最大公约数(Greatest Common Divisor(GCD)) 基本概念 最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的 ...
- C语言中如何求最大公约数及如何求最小公倍数。
最大公约数: ...
- 常见算法:C语言求最小公倍数和最大公约数三种算法
最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...
- C语言求最小公倍数和最大公约数三种算法(经典)
把以前写的一些经验总结汇个总,方便给未来的学弟学妹们做个参考! --------------------------永远爱你们的:Sakura 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们 ...
- C语言求最小公倍数和最大公约数三种算法
最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...
随机推荐
- ArcGIS提取水系并进行生态敏感性分析
1.前言 此前已经发表过一篇名为<ENVI提取水系并进行生态敏感性分析>的随笔,这篇是用ArcGIS进行水系提取,与前者的区别是上篇一般是对遥感影像进行处理,准确性较高:这篇是讲在没有遥感 ...
- 使用flask进行mock接口
在测试日常过程中,我们经常会遇到因为环境问题,或者是因为上下游,前后端开发进度不一,提测时间不一等情况.这时候我们可以通过mock的方式去完成一些操作.今天给大家分享一个通过flask去mock接口, ...
- 西门子S7-1200PLC不让下载一直报“模块具有激活的测试和调试功能,防止下载到设备”解决方法
错误如图 这是因为PLC被强制了,导致下载会报这类错误.取消强制就可以下载. 或者将cpu重置为出厂设置,也能再次下载. 参考:https://www.ad.siemens.com.cn/servic ...
- K8S原来如此简单(七)存储
emptyDir临时卷 有些应用程序需要额外的存储,但并不关心数据在重启后仍然可用. 例如,缓存服务经常受限于内存大小,将不常用的数据转移到比内存慢.但对总体性能的影响很小的存储中. 再例如,有些应用 ...
- 你是怎么看Spring框架的?
Spring是一个轻量级的容器,非侵入性的框架.最重要的核心概念是IOC,并提供AOP概念的实现方式,提供对持久层,事务的支持,对当前流行的一些框架(Struts,Hibernate,MVC),Spi ...
- Java的HashMap是如何工作的?
HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值. HashMap 基于 hashing 原理,我们通过 put ()和 get ()方法储存和获取对象.当我们将键值对 ...
- Springmvc入门基础(三) ---与mybatis框架整合
1.创建数据库springmvc及表items,且插入一些数据 DROP TABLE IF EXISTS `items`; CREATE TABLE `items` ( `id` int(11) NO ...
- 如何获取所有的参数名和参数值?用request.getParameterNames(); Enumeration enu=request.getParameterNames(); while(enu.hasMoreElements()){ String paraName=(String)enu.nextElement(); System.out.println(paraName+"
用request.getParameterNames(); Enumeration enu=request.getParameterNames(); while(enu.hasMoreElemen ...
- WSGI是个啥?大白话告诉你wsgi做了什么!
定义: 官方定义:wsgi是Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之 ...
- mybatis-03-一对多关系映射(附源码)
sb_mybatis /* Navicat MySQL Data Transfer Source Server : 阿里云 Source Server Version : 50724 Source H ...