详解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;
}


猜你喜欢
- 传统的多分支方式(圈复杂度为6):public String order(String type) { if ("1&
- 工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式
- 最近研究OpenCV想用java进行开发,因此研究了一下怎么在Eclipse中配置基于java的Opencv.第一步:先到OpenCV官网下
- 一、前言系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的。所以我们可能会写大量的if else等判断逻辑,特别是在不同方法
- 在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问
- * 的工作原理如图 * 是由每一个action请求(request)都包装在一系列的 * 的内部,通过redirectAction再一次
- 1 前言一般我们在Android的APP开发中,APP的界面如下: 可以看到,有状态栏、ActionBar(ToolBar)、导航
- 1:首先我们看一下数据库的表:这里的pid就是代表他的父节点id,如果没有父节点,那么pid就是0,上面的表就可以看作是一个tree结构,那
- 多层嵌套JSON类型数据解析简单来说:“key”:“value&rdqu
- 本篇我们讲解下使用spring创建bean的几种方式,创建bean,也可以叫组件注册,就是把单例bean放到spring容器中。我们定义如下
- 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”。异常通常由错误的代码引发,并由能够更正错误的代码进行
- 在Word文档中,超链接是指在特定文本或者图片中插入的能跳转到其他位置或网页的链接,它也是我们在编辑制作Word文档时广泛使用到的功能之一。
- 配置操作第一步操作如图:选择右侧的database页签,一般在idea的右边会有Database界面,点击它即可。有时候我们会发现这个Dat
- 类注解@component 标注类,泛指各种组件,类不属于各种分类的时候,用它做标注。@Service 标注类,声明该类为业务层组件,用于处
- DataGridView 列有三种排序模式。每一列的排序模式是通过该列的 SortMode 属性指定的,该属性可以设置为以下的 DataGr
- JavaScript 中需要创建函数的话,有两种方法:函数声明、函数表达式,各自写法如下:// 方法一:函数声明function foo()
- String类原生的字符串处理方法short s=1;s=s+1;与short s=1;s+=1;的区别一、“+&
- 消息都是存放在一个消息队列中去,而消息循环线程就是围绕这个消息队列进入一个无限循环的,直到线程退出。如果队列中有消息,消息循环线程就会把它取
- 本文实例讲述了C#实现对象XML序列化的方法。分享给大家供大家参考。具体实现方法如下:using system;using system.x
- 今天介绍一下,我在项目开发过程中,实现状态栏和虚拟按键背景颜色变化的方法,实现方式是,通过隐藏系统的状态栏和虚拟按键的背景,实现图片和背景显