前言

  • 这个求解方式多样化,灵活变动,但是,网上没有很好的资源和很全的代码,特此练习,敲打后,总结成本片文章.

单一求解

一.最大公约数

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语言求最大公约数最小公倍数(多种方法)的更多相关文章

  1. c语言求最大公约数和最小公倍数

    求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因 ...

  2. c语言求最大公约数和最小公倍数(转)

    最大公约数与最小公倍数的求解是很多初学C的人所面临的一道问题.当然这道问题并不难解答,也有很多人已经写过相关的博客,我在此书写此篇博客,一是为了让自己能够夯实基础,另外就是希望能够帮到和我一样的初学者 ...

  3. C语言 · 求最大公约数

    算法提高 求最大公约数   时间限制:1.0s   内存限制:512.0MB      编写一函数gcd,求两个正整数的最大公约数. 样例输入: 5 15样例输出:5 样例输入: 7 2样例输出:1 ...

  4. c语言求最大公约数

    求差判定法. 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60 ...

  5. Java求最大公约数和最小公倍数

    最大公约数(Greatest Common Divisor(GCD)) 基本概念 最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的 ...

  6. C语言中如何求最大公约数及如何求最小公倍数。

    最大公约数:                                                                                               ...

  7. 常见算法:C语言求最小公倍数和最大公约数三种算法

    最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...

  8. C语言求最小公倍数和最大公约数三种算法(经典)

    把以前写的一些经验总结汇个总,方便给未来的学弟学妹们做个参考! --------------------------永远爱你们的:Sakura 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们 ...

  9. C语言求最小公倍数和最大公约数三种算法

    最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...

随机推荐

  1. vue3-动态组件的要点

    <!--动态组件--> <!--缓存,只缓存about和home组件--> <keep-alive exclude="about" > < ...

  2. 盘点十大GIS相关算法

    1.道格拉斯-普克算法(Douglas–Peucker) 道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是将曲 ...

  3. centos根目录扩容

    一.扫描磁盘 若已在虚拟机增加了磁盘且没看到磁盘 运行下面的命令来查找系统中所有的主机总线编号: # ls /sys/class/scsi_host 得到主机总线编号后,运行以下命令来发现新的磁盘: ...

  4. zabbix图形中文乱码

    别的贴子都是说到修改/usr/share/zabbix/include/defines.inc.php中的 define('ZBX_FONT_NAME', 'msyh'); define('ZBX_G ...

  5. python获取本地时间,时间戳与日期格式相互转换

    附上代码与运行结果截图: import time # 获取当前时间 now = time.localtime() # 格式化日期 now_ = time.strftime('%Y-%m-%d %H:% ...

  6. First Note

    第一篇博客 入驻博客园.

  7. 如何批量修改图片名称(win下)

    深度学习目标检测任务中常常需要大量的图片,这些图片一般来自网络爬虫或是自行批量下载,但下载下的图片常常在保存时被命名为长段英文数字混写,因此规律化命名下载的图片数据名称就显得尤为重要了,下面我演示在本 ...

  8. 进制转换 Java day6

    今天周末学习的不多,只学习了一些二进制转十进制,八进制.十六进制,以及数据单位 二进制转十进制 我们都知道十进制转二进制就是除以2取余的方法.那二进制转到十进制又如何处理呢,今天我来学习以下 我们看看 ...

  9. JavaScript 02 运算符,分支结构

    一元换算符 字符串类型 对于字符串,来说自增或自减会自动进行类型转换 1.var str = '10' 自动转换 从string转为number 2.str++ NaN 对于转化不成功的string类 ...

  10. springboot监听kafka(不使用spring-kafka)

    一.不使用spring-kafka的原因 kafka服务端版本为0.10.0.1-Ipv20191220-hbp2.1.0,为避免版本问题导致监听失败,客户端也采用0.10.0.1版本,客户端0.10 ...