编程之美 -- 2.7 最大公约数问题

最大公约数GCD 题目描述 两个正整数的最大公约数(GCD)是能够整除这两个整数的的最大整数。 计算GCD有三种方法: (1)穷举法:由于a,b的最大公约数不可能比a和b中的较小者还大,否则一定不能整除它。因此先找到a和b中的较小者t,然后从t开始逐次减1尝试每种可能,即检验t到1之间所有正整数,第一个满足公约数条件的t,就是a和b的最大公约数。 (2)欧几里得算法,也称辗转相除法。对正整数a和b,连续进行... 阅读详情

题目描述

求解X 和 Y 的最大公约数f(x, y)


解法一:

使用辗转相除法,f(x, y) = f(y, x % y), x 和 y 数字偏大则取模运算偏多而开销大


解法二:相减法,f(x,y) = f(x-y,y) , (x > y)。 可以解决取模开销问题,但是相对减法则迭代次数偏多


解法三:结合以上两种优势,如果每次递归求解时

1、同为偶数,则f(x,y) = 2 * f(x, y)

2、x奇数y偶数,则f(x,y) = f(x>>1, y)

3、y奇数x偶数,则f(x,y) = f(x,y>>1)

4、同为奇数,则f(x, y) = f(x-y, y), x>y


package chapter_2_binary;

import java.util.Scanner;

/**
 * @author LiangGe
 *
 *	求解x和y的最大公约数
 *
 */
public class question_2_7_1 {
	
	/**
	 * @param x
	 * @param y
	 * @return 
	 * 
	 * 直接使用相除法
	 * 
	 */
	public static long gcd(long x, long y) {
		return (y == 0) ? x : gcd(y, x % y);
	}
	
	/**
	 * @param x
	 * @param y
	 * @return 
	 * x和y的最大公约数同时也是 x-y 和 y的最大公约数
	 * 使用相减法,可以避免数字很大时候的除法运算
	 *  
	 */
	public static long bigGcd(long x, long y) {
		if(x < y) {
			return bigGcd(y, x);
		} else if(y == 0) {
			return x;
		} else {
			// 迭代次数太多,如果10000000 1 则计算效率降低
			return bigGcd(x - y, y);
		}
	}
	
	/**
	 * @param x
	 * @param y
	 * @return
	 * 
	 * 结合以上两种方式的优势
	 * 根据x和y的奇偶性质,简化计算方式
	 * 
	 */
	public static long bigGcd2(long x, long y) {
		if(x < y) {
			return bigGcd2(y, x);
		} else if(y == 0) {
			return x;
		} else {
			if(x % 2 == 0) {
				if(y % 2 == 0) {
					// 如果x和y都是偶数,则gcd(x,y) = 2*(x/2,y/2)
					return 2 * bigGcd2(x>>1, y>>1);
				} else {
					return bigGcd2(x>>1, y);
				}
			} else {
				if(y % 2 == 0) {
					return bigGcd2(x, y>>1);
				} else {
					return bigGcd2(x - y, y);
				}
			}
		}
	}
	
	public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in);
		long num = scanner.nextLong();
		scanner.nextLine();

		while (num-- > 0) {
			long x = scanner.nextLong();
			long y = scanner.nextLong();
			
			System.out.println("(" + x + ", " + y + ") 最大公约数 = " + gcd(x, y));			
			System.out.println("(" + x + ", " + y + ") 最大公约数 = " + bigGcd(x, y));			
			System.out.println("(" + x + ", " + y + ") 最大公约数 = " + bigGcd2(x, y));			
		}
	}
}


Cursor AI对话历史丢失?开源工具一键恢复项目聊天记录 在软件开发中,数据持久化与工作区管理是保障开发效率与上下文连续性的基础技术。其核心原理在于通过文件系统路径、数据库存储等机制,将应用状态与用户数据持久化关联。对于依赖AI辅助编程的开发者而言,对话历史是宝贵的项目上下文资产,记录了关键的算法思路、API使用范例和问题解决方案。然而,当开发工具(如基于VS Code的Cursor)采用基于项目绝对路径的工作区隔离机制时,项目路径的变更会导致历史对话看似“丢失”,实则是被隔离在了旧路径对应的数据沙箱中。这直接影响了开发体验与知识沉淀的效率。cursor-chat 阅读详情

相关推荐

(04730)半导体器件之基本放大器工作原理(一)

放大器是构成各种电子线路的基本单元电路。所谓“放大”,就是将输入的微弱信号(微弱变化的电压或电流等)去控制直流电源提供的能量,并使输出按照输入的小信号变化规律而变化的过程。所以放大器的本质是能量转换器。本节重点学习基本放大电路的工作原理和基本分析方法及主要性能指标。

黄先生的博客 3004

C语言:最大公约数。

两个正整数的最大公约数是能够整除这两个整数的最大整数。 请按如下函数原型编写计算最大公约数的函数 Gcd()。 int Gcd(int a, int b); 在主函数中调用该函数计算,并输出从键盘任意输入的两整数的最大公约数。 要求输入提示信息为: “Input a,b:\n” 要求输入格式为: “%d,%d” 要求输出格式为 如果 a 或 b 不是正整数,输出: “Input number sh...

耳东 4383

Windows下用Docker快速搭建SearXNG私有搜索引擎(附Dify集成配置)

本文详细介绍了在Windows环境下使用Docker快速搭建SearXNG私有搜索引擎的完整流程,包括环境准备、容器化部署、安全配置优化以及与Dify平台的深度集成方法。通过分步指导和实用配置示例,帮助开发者构建兼具隐私保护和AI增强能力的本地化搜索解决方案,特别适合需要定制化搜索服务的应用场景。

weixin_30300225的博客 336

两个正整数的最大公约数(Greatest Common Divisor,GCD)是能够整除这两个整数的最大整数。请实现程序,用递归方法计算两个数的最大公约数。

#include <stdio.h> int Gcd(int a, int b); int main() { int a, b, c; scanf("%d %d", &a, &b); c = Gcd(a,b); if (c != -1) { printf("%d\n", c); } else { printf("Input number should be positive!\n");...

weixin_63381305的博客 3515

雷赛控制卡全方位使用指南:从硬件连接到高级应用

雷赛控制卡以其接口简单、编程便捷、性价比高的特点,成为中小自动化设备的理想选择。使用时需注意:硬件连接需注重抗干扰设计(屏蔽线、接地);软件开发需合理配置运动参数(脉冲当量、加减速);调试阶段需充分利用 DMCStudio 工具验证性能。通过本文介绍的方法,可快速实现从硬件搭建到复杂运动控制的全流程开发,满足雕刻、切割、装配等多场景的自动化需求。

品质生活,极致编程。 3767

手把手教你用ObjectCRX进行Caxa二次开发:从零开始的环境搭建教程

本文是一份面向零基础初学者的Caxa二次开发实战指南,重点讲解如何使用ObjectCRX框架从零开始搭建开发环境。内容涵盖Visual Studio 2015版本锁定、ObjectCRX向导集成、项目创建、典型错误解决,并最终实现一个可在Caxa中运行的HelloWorld程序,帮助开发者快速入门并避开常见陷阱。

w3x4y的博客 509

6-6 C程序设计 习题 7.7.2 辗转相除法求最大公约数 (10 分)

辗转相除法求最大公约数

qq_60921188的博客 1326

29、固态变压器拓扑、设计及其应用深度解析

本文深入解析了固态变压器(SST)的拓扑结构、设计方法及其在智能电网和能源互联网中的应用。重点探讨了机器学习在SST优化设计中的应用,包括中高频变压器设计、整体系统优化与建模研究。文章详细介绍了多端口SST的拓扑特点、功率传输机制及其作为能源路由器的关键作用,分析了不同端口数量下的控制复杂度与应用场景,并通过案例研究展示了四端口SST在分布式能源系统中的实际应用。最后,文章总结了多端口SST面临的技术挑战,并展望了未来在先进控制策略、集成化设计和标准化方面的发展方向。

study的专栏 3790

编程之美2.7 最大公约数问题

求两个正整数的最大公约数 方法1、辗转相除法 int gcd(int a,int b) { if(a<b) { return gcd(b, a); } if(b==0) { return a; } return gcd(b, a%b); } 缺点; 如果该整数是大整数,那么需要频繁地去做取余运算 方

richard_如风的专栏 1126

31、双相不锈钢直齿轮加工与性能研究及人工神经网络在焊接中的应用

本文研究了双相不锈钢直齿轮在不同加工方法(WEDM与滚齿加工)下的磨损行为,分析了表面粗糙度、齿厚变化、磨损率及润滑性能随转速的变化规律,并对比了两种工艺的优劣。同时,探讨了人工神经网络(ANN)在AA7050铝合金搅拌摩擦焊中的应用,通过建立工艺参数与焊接质量之间的预测模型,实现了对焊缝硬度和峰值温度的准确预测。研究为高性能齿轮制造和铝合金焊接提供了理论支持和技术参考,并提出了未来在润滑优化、加工工艺改进及智能控制方面的研究方向。

ggg99的专栏 150

从零开始讲DDR(5)——读懂Datasheet

对于开发人员来说,需要根据实际场景和使用的需要,使用不同厂家,不同型号的DDR,虽然原理上大同小异,但是还是有一些细节上的需要注意的地方,接触一个新的DDR芯片,首先就是需要找到对应的datasheet,而能都读懂datasheet,也是一个硬件工程师的必备技能。

apple_53311083的博客 5217

编程之美-2.7最大公约数问题java解法

编程之美-最大公约数问题java解法 包括五种方法,最后有一个判断奇偶数的方法isEven(); package code.beauty.fungame; public class GCD { public static void main(String[] args) { int gcd = solutionGcd5(30,42); System.out.pri

asheng010的专栏 760

Simulink开发项1000例实战专栏--实例64:基于Simulink构建一个储能系统模型

通过引入储能系统,太阳能电站能够实现在白天储存多余的能量,在夜晚释放能量,平滑负荷曲线,提高电网的稳定性和可靠性。本项目的目标是基于Simulink平台,构建一个完整的储能系统模型,并通过仿真验证其在电网调峰中的应用效果。通过引入储能系统,工业园区能够实现在负荷高峰期释放能量,在负荷低谷期储存能量,平滑负荷曲线,降低用电成本,提高电网的稳定性和可靠性。通过引入储能系统,风力发电场能够实现在负荷高峰期释放能量,在负荷低谷期储存能量,平滑负荷曲线,提高电网的稳定性和可靠性。

xiaoheshang_123的博客 514

[编程之美] PSet2.7 最大公约数问题

 问题描述: 求两个正整数的最大公约数Greatest Common Divisor (GCD)。如果两个正整数都很大,有什么简单的算法吗? 例如,给定两个数1 100 100 210 001, 120 200 021,求出其最大公约数。

飞扬的青春的专栏 958

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《编程之美》2.7 最大公约数问题解法3改进

求两个正整数的最大公约数。 /******************************************************************************* 求解最大公约数,编程之美2.7解法三改进版 (1)对于x,y,如果y=k*y1,x=k*x1,则f(y,x)=K*f(x1,y1) (2)如果x=p*x1, 假设p是素数,且y%p !=0 ,即y不能

hugang012070的专栏 922

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

编程之美 2.7最大公约数问题

编程之美 2.7最大公约数问题 bool isEven(int n) { return (n&1) == 0; } int gcd(int x, int y)//注意递归的基准情况和x,y同为偶数的情况 { if(x<y) { return gcd(y,x); } if(y==0) return x; //以上两步为递归算法中的基准情况!! if(isEven(x)

Notes 344

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

编程之美 2.7 最大公约数问题

2.7 最大公约数问题 问题描述: 求2个正正数的最大公约数,如果2个数很大,有什么简单的算法吗?  解法1:辗转相除法  假设f(x, y) 表示x,y的最大公约数是g,而k=x/y,b=x%y,则g必能整出b。 因为x=ky + b,b=x-ky,b/g=(x-ky)/g一定为整数,所以必有g整除b。 如下所示: f(42, 30) = f(30, 12) = f(12, 6

小人物的草稿本 711

编程之美之2.7 最大公约数问题

问题: 求两个数的最大公约数 解法一: 欧几里得辗转相除法: f(x,y) = GCD(x,y), 取k = x / y, b = x % y,则:x = k*y + b; 如果一个数能整除x,y,则它也能整除b,y; 而且能整除b,y的数必能整除x,y,即x,y和b,y的公约数是相同的,其最大公约数也是相同的,即f(x,y) = f(y ,x % y) (x>=y>0)

SmartSi 1597

《编程之美》2.7 最大公约数问题

整理一下想法。 辗转相除法:原理:设f(x,y)表示x,y的最大公约数,取k=x/y,b=x%y,那么x=ky+b。由此可得,如果一个数可以整除x和y,那么也可以整除y和b,即f(y,b)=f(x,y)。即f(x,y)=f(y,x%y)。优点:高效缺点:取模运算,开销大 辗转相减法:原理:设f(x,y)表示x,y的最大公约数k,则可设x=mk,y=nk,则有x-y=

600

编程之美2.7——最大公约数问题

1、辗转相除法 int gcd1(int x, int y) { if(y == 0) return x; else return gcd1(y, x % y); } 2、辗转相减法 int gcd2(int x, int y) { if(x < y) return gcd2(y, x); if(y == 0) return x; else return gcd

wxl3105的专栏 764

【编程之美】2.7最大公约数问题

问题: 求两个数的最大公约数 解法一: 欧几里得辗转相除法: f(x,y) = GCD(x,y), 取k = x / y, b = x % y,则:x = k*y + b; 如果一个数能整除x,y,则它也能整除b,y; 而且能整除b,y的数必能整除x,y,即x,y和b,y的公约数是相同的,其最大公约数也是相同的,即f(x,y) = f(y ,x % y) (x>=y>0)

solar一抹阳光的专栏 579

编程之美2.7 最大公约数问题

//题目:求两个数的最大公约数 //解法1:使用辗转相除法:f(a,b) = f(a%b,b),直到一个数为0 public class Main { public static void main(String[] args) throws Exception { System.out.println(getGcd1(42,80)); System.o

wxwxy 346

编程之美2.7节求最大公约数问题

用java写的关于求最大公约数的三种方法:package suda.alex.chapter2; import java.util.*;public class Gcd { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = n

Alex-zhai专栏 733

编程之美-2.7、最大公约数问题

#include "stdafx.h" #include using namespace std; /*思路一 辗转相除法 f(x,y)=f(y,x%y)(x>=y>0) 以此递归,直到一个数为0 */ int g1(int x,int y) {     return (!y)?x:g1(y,x%y); } /*思路二 二进制除2,采用移位方法 辗转相除

泡泡大脚的博客 743
上一篇: 编程之美 -- 2.5 寻找最大的K个数(堆排序方法)
下一篇: mysql 基本使用 : 中文乱码问题
java_wliang
博客等级 码龄15年 19粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值