自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(102)
  • 收藏
  • 关注

原创 从零到一手写一个小型RPC框架——介绍篇

小型入门RPC框架

2022-12-09 18:01:54 854 1

原创 Zookeeper基础学习(一):概述篇

Zookeeper概述相信有过微服务经验的同学一定听说过Zookeeper、Nacos等注册中心、配置中心的大名,从今天开始系统认真学习一下Zookeeper的基本原理;首先抛出几个问题,这也是解决Zookeeper这类中间件到底解决了什么问题的关键:Zookeeper是什么?Zookeeper能做什么?Zookeeper是什么?根据官网文档的介绍:ZooKeeper: A Distributed Coordination Service for Distributed Applicat

2022-02-24 00:07:20 1092

原创 JVM基础学习(二):内存分配策略与垃圾收集技术

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来垃圾收集概述Java内存模型中的堆和方法区是垃圾收集技术所需要关注的终点,因为其他的区域会跟随线程的结束而自动回收。而需要解决垃圾收集的首要目标便是解决如何判断一个对象已经不需要了从而自动进行回收;判断对象是否可以进行回收的算法可以分为引用计数算法与可达性分析算法。对于Redis有一些了解的同学应该知道Redis的对象内存回收算法便是使用的引用计数算法;而JVM都是使用的可达性分析算法,在此我.

2022-02-21 12:54:09 348

原创 Redis持久化机制之RDB

Redis的持久化机制有两种:RDB持久化和AOF持久化。因为Redis是一个内存数据库,如果没有合适的持久化机制,那么一旦服务器进程退出,服务器中的数据库状态也会消失。本章介绍RDB持久化机制。RDB持久化RDB持久化,是Redis可以将数据库状态保存到一个RDB文件中,并可以通过该RDB文件生成RDB文件的时候的数据库状态。RDB文件是一个经过压缩的二进制文件。生成RDB文件的Redis命令有两个:SAVEBGSAVESAVE命令会阻塞Redis服务器,此期间服务器不能处理任何命令请求;

2022-02-15 19:20:21 1058 1

原创 深入MySQL(四):MySQL的SQL查询语句性能优化概述

对于MySQL的优化而言,SQL查询语句的优化是重要的一部分,一个好的查询语句可以使得该查询的执行效果响应快且获取数据准确。对于语句查询的原理,我浅读了《高性能MySQL》之后总结为一下几点,所有的SQL查询语句优化的原理归根结底都可以看做以下几点的运用。优化数据访问优化扫描行数重构查询优化数据访问对于一个查询而言,有时候导致查询性能低下的原因有可能是因为访问的数据太多,我们可以通过减少访问的数据量进行优化。根据这一策略,我们可以将优化数据访问的步骤分为以下两步:确认应用程序是否检索大量

2022-02-05 02:03:48 743

原创 深入MySQL(三):MySQL的索引的应用

在MySQL的优化中,索引的作用绝对算是一个大头,很多时候索引使用得当可以使得一个查询的效率提高几个数量级,同时它还具有自动排序等功能。所以如果是深入MySQL,那么索引绝对是其中重要的一部分。MySQL中的索引MySQL中的索引按类型分大致可以分为5类:主键索引普通索引唯一索引文本索引组合索引主键索引定义:唯一且不为空,简称主键,表中可以没有主键,但是最多只能有一个;在Innodb中,会默认将主键索引设置为聚簇索引;一般而言,主键索引的建立符合以下的原则:与业务无关的自增属性

2022-01-30 23:26:37 1029

原创 深入MySQL(二):MySQL的数据类型

前言对于MySQL中的数据类型的选择,不同的数据类型看起来可能是相同的效果,但是其实很多时候天差地别。本章从MySQL中的常用类型出发,结合类型选择的常见错误,贯彻MySQL的常用类型选择。常用类型MySQL的常用类型并不多,总的来说分为以下几种:整数类型实数类型字符串类型日期和时间类型整数类型存储整数的话,可以用以下几种数据类型进行表示:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,分别使用8,16,24,32,64位进行存储。同时还可以设置UNSI

2022-01-30 23:26:00 1511

原创 数据库面试常问知识点:事务相关知识整理

事务基本概念什么是事务事务:指一组操作,可以是一个SQL语句也可以是多个SQL语句;事务的特性一般来说,事务要满足四大特性(ACID)原子性(atomicity):一个事务是一个不可分割的工作单位,事务中的操作要么都成功要么都失败;一致性(consistency):事务必须是使数据库从一个一致性状态变成另外一个一致性状态;隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及其数据并发的其他事务是隔离的,互不干扰;持久性(durability):若一个事务已

2021-08-19 13:49:27 213

原创 Java集合进阶之序列化

Java集合进阶之序列化序列化序列化具体原理启示序列化首先我们大家都知道,我们的Java程序它是一直在内存中跑的,然后如果我们需要将一个对象持久化或者在网络中传输的话,那么我们就需要进行序列化,将其转化为二进制;然后在阅读源码的时候,我们都知道所有容器的底层都会有个存储变量,可能为数组或者其他数据结构,但是我发现基本上所有的容器它底层存储变量都添加了transient修饰符,该修饰符便代表着它并不能进行序列化操作,序列化操作的时候会忽略它;那么感觉与我们所了解的不符合,那么我们就会非常奇怪,接下来用

2021-08-09 00:06:47 320

原创 Java集合进阶之HashMap篇

Java集合进阶之Map篇Map概述预备知识:哈希表与哈希冲突Map概述Map是一个key-value对应的数据结构,他在实际生产环境与面试中都是高频使用与提问,今天我们来深入Map的底层源码,来学习比较各种map;预备知识:哈希表与哈希冲突Map的底层数据结构便是哈希表,所以我们有必要在学习Map之前先复习一下我们当时数据结构所学习的哈希表散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问

2021-08-08 23:56:27 300 1

原创 Java集合进阶之ArrayList与LinkedList

这里写自定义目录标题ArrayList类概述增ArrayList类概述ArrayList和LinkedList是Java集合类中常用的List类,其中我们众所周知的区别有ArrayList底层是数组,支持随机访问;LinkedList底层是链表,不支持随机访问;LinkedList由于底层是链表,所以其insert与remove操作会比ArrayList快很多;LinkedList常用于栈(Stack)与队列(Queue)容器嘛,最为核心的属性便是增、删、改、查这四个属性了,而我们今天来深入

2021-07-29 17:33:52 511

原创 计算机网络应用层(二):DNS协议详解

DNS协议详解前言DNS协议概述DNS工作原理DNS缓存前言DNS是计算机网络中应用层的一个协议,可能很多同学碰到过DNS被劫持的情况,我们现在来学习一下DNS协议,来了解为什么DNS被劫持之后,我们便不能访问互联网的原因。DNS协议概述我们在网络上看到的url格式可能是这样的:www.google.comgoogle十分适合我们人类记忆,因为其是一个简单易记的单词形式。因特网上的主机可以用多种方式进行标识,常见的有两种:利用主机名进行标识,例如www.google.com利用IP地

2021-07-18 19:16:51 5193 3

原创 计算机网络应用层(一):HTTP协议详解

前言本博客参考内容来自**《计算机网络自顶向下方法》**与网络博客总结HTTP概况Web的应用层协议为HTTP协议(超文本传输协议),是web的核心。HTTP由两个程序实现:用户程序、服务器程序。基本Web术语Web页面:Web页面(文档)由对象组成。一个对象只是一个文件,比如HTML文件,JPEG文件等。多数Web页面含有一个HTML页面和多个引用对象。Web浏览器:实现HTTP的客户端。Web服务器:实现HTTP的服务端,存储Web对象,每个对象由URL寻址。往返时间(Round-T

2021-07-16 11:28:35 1079 1

原创 SpringBoot中对于拦截器的使用与应用场景解析

应用场景权限检查:检查是否有访问某接口的权限;日志记录:记录请求信息的日志,便于进行信息监控与统计;性能检测:慢日志等记录时间的场景;如何实现拦截器拦截器接口public interface HandlerInterceptor { /** * 预处理回调方法,预处理 * @param request 请求 * @param response 响应 * @param handler 响应的处理器,自定义Controller * @return 返回true则流程继续,返

2021-06-20 11:50:48 525

原创 MySQL原理学习(一)基础架构

MySQL基础架构前言MySQL组件分层连接器查询缓存分析器优化器执行器小结前言本系列基于极客时间MySQL45讲,加以自己的理解以及查阅博客等资料汇总整理,以供大家一起交流学习。MySQL组件分层MySQL可以分为Server层与存储引擎层。Server层包括:连接器查询缓存分析器优化器执行器其他内置函数的实现(日期、时间、数学、加密等)具体作用举例:存储过程、触发器、视图等。存储引擎层包括:数据的提取和存储。其架构模式是插件式的,也就是说,可以指定多种数据库引擎,在现

2021-06-13 21:47:47 123

原创 对于Java IO的一些理解

Java NIO前言前言在学习JavaSE的时候,大部分人学习的IO都是基于流的BIO,叫做阻塞io。BIO的早期处理文件的方式是边读文件边处理数据,在后期引入了缓冲块流,将文件一次性读入内存再进行操作。而在jdk1.4中加入了nio的概念,被称为new i/o或者non-block i/o,它是面向Buffer的传输流,Buffer可以将文件一次性读入内存在做后续操作。在jdk1.7中推出了 nio2 , 提出了操作系统层面实现的异步I/O。今天就来进行Java的I/O比较。...

2021-06-11 20:09:40 1188 1

原创 雪花算法生成全局唯一ID的原理及其Java实现

账号生成算法账号生成算法随机数mysql自增推特开源的雪花算法雪花算法的优缺点总结账号生成算法相信大家都有过如何生成账号的困惑,今天我来说一下我初学的时候常用的账号生成算法。随机数mysql自增主键雪花算法随机数当时刚刚学习JavaSE,想的是直接随机数生成id,不知道mysql主键可以进行自增。简单来说,随机生成id会有以下缺点:每次生成一个id,需要去mysql中查询是否有重复的,这样数据量巨大的时候便会效率及其低下。分布式环境下若代码比较烂可能会产生线程安全问题。所以随机

2021-06-06 23:52:30 672 1

原创 JavaSE之Java反射机制详解

JavaSE之反射机制什么是反射反射提供了哪些功能反射如何使用获取Class对象的方式通过类的class属性通过Object对象的getClass方法通过Class类的forName()静态方法通过ClassLoader构建Class反射的使用创建对象什么是反射Java反射机制是指在运行状态中,对于任意一个类,都可以知道该类的所有方法和属性;对于任意一个对象,都可以调用该类的任何一个方法和属性;这种动态获取对象信息和动态调用对象的方法的功能称为Java的反射机制。简单来说,就是在运行过程中,将对象的方

2021-06-06 22:01:48 431 4

原创 一文带你了解MySQL的数据类型以及常见使用场景

前言MySQL中有许多数据类型,其中用的最多的便是varchar,int等。但是使用过程中我们也会对其他数据类型的使用有疑问,今天就写一篇博客来介绍一下MySQL中的数据类型,及其使用场景。数据类型分类MySQL中的数据类型大致可以分为3大类:数值类型日期/时间类型字符串(字符)类型当然还有一些比较特殊的数据类型,比如 ENUM 等。数值类型数值类型相信很多同学都跟我一样,数据量小的时候使用 int 类型,数据量大的时候使用 bigint 类型。但是其实MySQL里面有多种数据类型,

2021-05-30 20:08:43 717

原创 一文带你了解VO、BO、DTO、POJO的异同

之前学习SSM的时候没有分包与安全的概念,写项目传输的都是pojo类,参考了其他大佬的发现他们都是再次进行封装,只给前端必要的信息,于是我去找学长了解了一下相关知识,本文系统介绍一下VO、BO、DTO、POJO的异同与使用。概念VO(View Object):视图对象,用于展示层,用处是将某个指定页面的所有数据封装起来。DTO(Data Transfer Object):数据传输对象,泛指展示层与服务层之间的数据传输对象。DO(Domain Object):领域对象(实体对象),从现实世界中抽象出来

2021-05-29 21:24:24 1047

原创 多线程与高并发(三)线程池详解

前言本篇主要介绍线程池的源码。Java中内置的线程池Java中内置的线程池有两种:ThreadPoolExecutorExecutor阿里的规范中强烈不推荐使用Executor这个类作为线程池,但是我们还是需要讲解他的使用、优缺点以及为什么不选择该接口。Executor接口public interface Executor { /** * Executes the given command at some time in the future. The comma

2021-05-20 12:17:09 112

原创 多线程与高并发(二)Java创建多线程

前言该节主要介绍Java创建线程的三种方式。继承Thread类实现Runable接口实现Callable接口此外还介绍一种与线程有关的技术:线程池。继承Thread类我们若用继承Thread类来实现多线程的话,我们还需要重写其run()方法,并且用start()来启动该线程。public class ThreadTest extends Thread{ public static void main(String[] args) { Thread t1 = new

2021-05-18 19:05:42 105 1

原创 多线程与高并发(一)多线程基础讲解

前言之前大一的学习JavaSE的时候,感觉大脑就是一团浆糊,根本学不懂,也不理解锁什么的概念,今天开始重新复习一下多线程。进程与线程、并发与并行概念进程:正在运行的程序。线程:进程中的多条执行路径。由概念定义可得,一个进程含有多个线程。我们最经典的例子就是我们的垃圾回收线程与主线程的关系。它们是两个不同的线程,但是同时运行,同时将部分数据在两个线程间可见,既垃圾回收线程一旦回收一个对象,那么主线程便可以立即知道其发生。即它们之间数据是共享的。并发:多条线程在同一时间段内交替执行;并行:多

2021-05-11 23:05:45 209

原创 设计模式——观察者模式详解

文章目录前言观察者模式结构Java对于观察者模式的支持观察者模式与MVC总结例子前言观察者模式是使用频率最高的设计模式之一,当对象间存在一对多关系时候就可以使用观察者模式。观察者模式又被称为发布-订阅模式模型-视图模式源-监听器模式从属者模式观察者模式是一种对象行为型模式。定义对象间的一种一对多依赖关系,一个对象发生更改时候,自动通知其他对象,被通知的对象称为观察者。例如:一个变量的修改,需要自动通知依赖它的对象。观察者模式结构观察者模式结构图中主要有以下角色Subject(

2021-04-10 14:58:34 548

原创 设计模式——原型模式详解

这里写目录标题原型模式主要解决优点缺点使用场景如何使用原型模式原型模式用于创建已有对象的复制,然后又保证性能。主要解决当创建一个对象对于性能损耗很大的时候,我们可以创建一个对象的复制。优点性能提高逃避构造函数的约束缺点当一个类引用不支持串行化的间接对象时,或者引用含有循环结构的对象时,难以实现。java中必须实现cloneable接口使用场景资源优化场景new一个对象的过程非常繁琐时类初始化的过程耗费资源过大性能和安全要求一个对象多个修改者如何使用Java中直

2021-04-06 09:10:39 70

原创 设计模式之单例模式

前言之前已经讲解完了常见的三种工厂模式,今天讲完单例模式的讲解。单例模式是一个非常常用但是很简单的一个设计模式,其意思也很好理解,也就是一个系统中,只有一个该对象存在。应用场景老规矩,先讨论应用场景。我们日常接触到的最多的单例模式其实就是任务管理器,还有之前在JavaSE阶段手敲的服务器其实也可以使用单例模式控制(数据量小时)。那我们可以发现单例模式的应用场景的共同点:应用场景:系统只需要一个实例对象,比如只需要一个对象的情况,或者开启一个对象所需要的资源太过庞大从而控制只能创建一个。(任

2021-04-01 21:46:52 288

原创 设计模式——抽象工厂模式

抽象工厂模式概述与工厂方法模式的区别引入了产品等级结构和产品族的概念,与工厂方法模式相比,抽象工厂模式中的具体工厂不只是用来创建一种产品,而是负责创建一族产品。抽象工厂模式定义抽象工厂模式: 提供一个创建一系列相关或者相互依赖对象的接口,无需指定具体的类。AbstractFactory(抽象工厂):声明一组用于创建一族产品的方法,一个方法对应一种产品。ConcreteFactory(具体工厂):实现抽象工厂中声明的创建产品的方法,生成一组具体昌平,构成一个产品族。AbstractProd

2021-03-31 10:42:03 105

原创 20210324牛客Java150题错题解

题目关于instanceof的应用正解为C,错解为A。instanceof是java中的一个二元操作符,作用是测试它左边的对象是否是它右边的类的实例。该题中 obj 对象声明为A类型,创建为D类型对象。D对象继承了B对象,B对象继承了A对象,而C对象又继承了B对象,也就是说,D并不是C的一个实例。JVM内存不包含如下哪个部分( )正解为D,错解为B。错误原因:众所周知,JVM内存区域大概分为五块:堆,栈,本地方法区,程序计数器,方法区。其中线程共享的是:堆,方法区。PC寄存器也叫程

2021-03-30 21:51:52 1943 3

原创 设计模式——工厂方法模式总结

工厂方法模式概述与简单工厂的区别工厂方法模式也是工厂模式的一种,对比简单工厂模式,他们之间的区别有以下几点:简单工厂模式是根据参数的不同用 if 与 else 判断返回的产品,其工厂职责很重,可能一个工厂类中有高达几个个 if 。而工厂方法模式将工厂分离,具体实现工厂继承同一个抽象工厂,具体实现工厂生产不同的产品。简单工厂模式如果要加入新的产品,那么必须修改工厂的逻辑,违背了“开闭原则”。而工厂方法模式则可以新建工厂或者产品,不用修改代码逻辑。定义与使用场景工厂方法模式:定义一个用于创建对

2021-03-20 20:36:41 213

原创 简单工厂模式

简单工厂模式概述简单工厂模式并不属于23个经典设计模式之一,但是通常将简单工厂模式作为学习其他工厂模式的基础。应用场景当需要大量创建同属于一类的不同对象时,我们可以应用简单工厂模式。概念工厂类:根据不同的参数用于创建具体产品对象的类。具体产品类:实际的产品类。抽象产品类:产品类进行抽象和提取后,将大量相同的操作或者变量封装到抽象类中。具体操作简单工厂模式:定义一个工厂类,可以根据参数的不同返回不同类的实例(一般具有共同的父类)。具体例子假设我们需要一些图形,这些图形有圆形、三角形……;

2021-03-16 18:38:20 154

原创 设计模式之面向对象设计原则

常见7种面向对象设计原则单一职责原则:一个类只负责一个功能领域中的相关职责。开闭原则:软件实体应对扩展开发,而对修改关闭。里氏代换原则:所有引用父类对象的地方能够透明的使用其子类的对象。依赖倒转原则:抽象不应该依赖于细节,细节应该依赖于抽象。接口隔离原则:使用多个专门的接口,而不使用单一的总接口合成复用原则:尽量使用对象组合,而不是继承达到复用的目的迪米特法则:一个软件实体应当尽可能少的与其他实体发生相互作用单一职责原则概述:一个类不能太大,应该一个类只处理一类问题。开闭原则(目标)

2021-03-13 19:06:53 123

原创 Java Object源码解析

最近开始系统记录Java的源码解析第一天主要总结Object的源码之前也看过Object的源码实现,但是没有系统整理。Object类概述该类是所有类的父类,所以其中的方法相当重要,我们先看下该类其中的主要方法与变量。Object类中所有方法有getClass()hashCode()equals(Object obj)clone()toString()notify()notifyAll()wait()wait(long timeoutMillis)wait(long timeo

2021-02-21 23:01:14 131

原创 关于volatile与synchronized的基本区别

今天写牛客题目简略了解一下volatile与synchronized的区别基础概念在并发编程中有两个关键性问题:线程之间如何通信以及线程之间如何同步可见性概括: 可见性是指线程之间的可见性,既一个线程修改之后,另外一个线程可以看到。指的是解决线程之间的通信问题在Java中,用volatile、synchronized和final实现可见性。原子性概括: 既操作不可以再进行分割。反例: a++,变量的自加操作实际是a=a+1,是可以分割的,所以自加并不是原子操作。非原子操作都会引起线程安全问

2021-02-03 22:52:58 160

原创 关于Java语言的几种数组复制方式比较

在今天的牛客刷题中遇到一道这个题先说结论,顺序从快到慢为:System.arraycopycloneArrays.copyOffor循环逐一复制System.arraycopy源码如下所示: @HotSpotIntrinsicCandidate public static native void arraycopy(Object src, int srcPos, Object dest, int

2021-02-02 21:30:16 97

原创 java中类的加载顺序

类的加载顺序父类静态对象和静态代码块子类静态对象和静态代码块父类非静态对象和非静态代码块父类构造函数子类 非静态对象和非静态代码块子类 构造函数总而言之,可以记为先父再子,静态最前且只执行一次,非静态之后再构造类中的静态块按照声明顺序执行(在类执行加载到方法区的时候执行的)总执行顺序的优先级为:静态域,main(),构造代码块,构造函数牛客错题此题按照顺序优先级可以得出:静态域:第一个静态域是一个静态变量 public static Test t1=new Test();

2020-12-19 11:25:13 197 1

原创 2020级1,5班第四次测试题解(A~C)

这是个不可描述的关系描述一天刘某在一教下向他喜欢的学姐B表白了,“对不起,我喜欢的是C”,B这样说道,刘某尴尬的笑了笑转身离开了。他心里默默说着“对不起,C喜欢我。”Love triangle被定义为:如果A喜欢B,B喜欢C,C喜欢A则称为Love triangle。现在让你寻找有没有Love triangle。格式样例分析题目大意如此。判断 a[a[a[i]]]==i 既可素数判定(JSU-ZJJ)素数判定(JSU-ZJJ)题目分析难点在于求解素数,设表达式为f(i),我们只

2020-11-17 13:51:36 507 1

原创 PTA 愤怒的牛

题目描述农夫约翰建造了一座有 n 间牛舍的小屋,牛舍排在一条直线上,第i间牛舍在 x[i] 的位置,但是约翰的 m 头牛对小屋很不满意,因此经常互相攻击。约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其它牛尽可能远的牛舍。也就是要最大化最近的两头牛之间的距离。牛们并不喜欢这种布局,而且几头牛放在一个隔间里,它们就要发生争斗。为了不让牛互相伤害。John 决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是多少呢?题目分析典型的最大值最小(最小值最大)问题,一般

2020-11-13 17:22:49 742

原创 NC68 跳台阶

跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。示例思路主要标签:递归非常明显的递归问题,我们已经知道 target = 1 时结果为1且 target = 2 时结果为2,那么我们的该题的递归出口便是target为1或者2的时候.而递归公式我们可以很明显的得出为JumpFloor(target)=JumpFloor(target-1)+JumpFloor(target-2)那么该题便可求解了.代码

2020-11-08 11:13:09 253

原创 2020级1,5班第二次上机测试补题

题解记录时间:2020.11.02 22:53问题 A: I still love you very much!(续)问题A思路将每一行的二进制数作为字符数组循环输入,然后用循环来求得。因为每一行的二进制数控制为8位,那么我们可以用一个循环来求得十进制的值,同时用一个字符数组保存起来。char a[15];scanf("%s",a);for(j=0;j<8;j++){ if(a[j]!='0') sum+=pow(2,7-j);}问题 B: 书到用时方恨少问题B

2020-11-03 15:01:47 2175 5

原创 CodeForces - 1041B

CodeForces - 1041B思路将x,y求最大公约数g,然后化为最简。最大公约数用辗转相除法求解ll gcd(ll a,ll b){ if(b!=0)return gcd(b,a%b); else return a;}代码#include <bits/stdc++.h>#define ll long longusing namespace std;ll gcd(ll a,ll b){ if(b!=0)return gcd(b,a%b);

2020-11-01 19:40:53 173

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除