详解C语言求两个数的最大公约数及最小公倍数的方法
作者:wuzhekai1985 时间:2022-02-28 01:17:25
求两个正整数的最大公约数
思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法。通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) (x >=y > 0)。根据通式写出算法不难,这里就不给出了。这里给出《编程之美》上的算法,主要是为了减少迭代的次数。
对于x和y,如果y = k * y1, x= k * x1,那么f(x, y) = k * f(x1, y1)。另外,如果x = p * x1,假设p为素数,并且y % p != 0,那么f(x, y) = f(p * x1, y) = f(x1, y)。取p = 2。
参考代码:
//函数功能: 求最大公约数
//函数参数: x,y为两个数
//返回值: 最大公约数
int gcd_solution1(int x, int y)
{
if(y == 0)
return x;
else if(x < y)
return gcd_solution1(y, x);
else
{
if(x&1) //x是奇数
{
if(y&1) //y是奇数
return gcd_solution1(y, x-y);
else //y是偶数
return gcd_solution1(x, y>>1);
}
else //x是偶数
{
if(y&1) //y是奇数
return gcd_solution1(x>>1, y);
else //y是偶数
return gcd_solution1(x>>1, y>>1) << 1;
}
}
}
求最小公倍数:
最常用的是辗转相除法,有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①
下面非递归版本:
int gcd_solution2(int x, int y)
{
int result = 1;
while(y)
{
int t = x;
if(x&1)
{
if(y&1)
{
x = y;
y = t % y;
}
else
y >>= 1;
}
else
{
if(y&1)
x >>= 1;
else
{
x >>= 1;
y >>= 1;
result <<= 1;
}
}
}
return result * x;
}
标签:公约数,公倍数
0
投稿
猜你喜欢
redis scan命令导致redis连接耗尽,线程上锁的解决
2021-11-19 02:57:52
Android Jetpack架构组件 ViewModel详解
2021-09-08 00:29:20
详解Matisse与Glide--java.lang.NoSuchMethodError:com.bumptech.glide.RequestManager.load
2021-06-21 02:09:19
Android开发之TabActivity用法实例详解
2022-08-09 00:09:03
在Spring环境中正确关闭线程池的姿势
2023-11-25 08:07:29
java向文件中追加内容与读写文件内容源码实例代码
2021-11-15 11:45:13
idea乱码修改bin目录下的idea.exe.vmoptions无效问题
2022-08-02 19:17:55
解决Java API不能远程访问HBase的问题
2023-11-27 04:17:48
C语言数据结构实现银行模拟
2023-04-16 17:25:49
C#迷你猜数实例分析
2023-11-02 16:10:49
DataBinding onClick的七种点击方式
2021-12-08 01:23:22
SpringBoot登录用户权限拦截器
2022-07-15 04:18:04
java编程实现基于UDP协议传输数据的方法
2022-11-14 04:22:22
Android使用ListView实现下拉刷新及上拉显示更多的方法
2023-01-10 04:29:45
Springboot+AOP实现返回数据提示语国际化的示例代码
2021-08-18 19:49:12
在C#中global关键字的作用及其用法
2021-12-24 04:33:19
DevExpress实现GridView当无数据行时提示消息
2023-08-23 04:13:33
Gradle的缓存路径修改的四种方法(小结)
2021-11-09 11:05:51
JAVA中对List进行查询
2023-12-17 20:41:20
java之swing下拉菜单实现方法
2023-07-12 04:55:30