C++求最大最小公约数
在 C++ 中,可以使用 欧几里得算法(辗转相除法)
高效计算两个数的最大公约数(GCD)。以下是几种实现方式:
方法
1:递归实现(推荐)
#include <iostream>using namespace std;int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b);}int main() { int a = 24, b = 36; cout << "GCD of " << a << " and " << b << " is: " << gcd(a, b) << endl; return 0;}
输出:
GCD of 24 and 36 is: 12
方法 2:迭代实现
#include <iostream>using namespace std;int...
什么是死锁?如何避免死锁?
什么是死锁?如何避免死锁?
死锁是指两个或多个进程在争夺系统资源时,由于互相等待对方释放资源而为无法继续执行的状态。
死锁只有同时满足以下四个条件才会发生:
互斥条件:一个进程占用了某个资源时,其他进程无法同时占用该资源。
请求保持条件:一个线程因为请求资源而阻塞的时候,不会释放自己的资源。
不可剥夺条件:资源不能被强制性地从一个进程中剥夺,只能由持有者自愿释放。
环路等待条件:多个进程之间形成一个循环等待资源的链,每个进程都在等待下一个进程所占有的资源。
只需要破坏上面一个条件就可以破坏死锁。
破坏请求与保持条件:一次性申请所有的资源。
破坏不可剥夺条件:占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
破坏循环等待条件:靠按序申请资源来预防。让所有进程按照相同的顺序请求资源,释放资源则反序释放。
每周LeetCode回顾-2
633.
平方数之和
思路:双指针
对于给定的非负整数 \(c\),需要判断是否存在整数 \(a\) 和 \(b\),使得 \(a^2+b^2=c\)。可以枚举 \(a\) 和 \(b\) 所有可能的情况,时间复杂度为 \(O(c^2)\)。但是暴力枚举有一些情况是没有必要的。例如:当
\(c=20\) 时,当 \(a=1\) 的时候,枚举 \(b\) 的时候,只需要枚举到 \(b=5\) 就可以结束了,这是因为 \(1^2+5^2=25>20\)。当 \(b>5\) 时,一定有 \(1^2+b^2>20\)。
假设 \(a\leq b\),初始时 \(a=0\),\(b=\sqrt
c\),进行如下操作:
如果 \(a^2+b^2=c\),我们找到了题目要求的一个解,直接返回
true;
如果 \(a^2+b^2<c\),此时需要将
\(a\) 的值加 \(1\),继续查找;
如果 \(a^2+b^2>c\),此时需要将
\(b\) 的值减 \(1\),继续查找。
当...
进程间通信方式
进程间通信方式
管道
命名管道
共享内存
消息队列
套接字(socket)
信号
信号量
管道:是一种半双工的通信方式,数据只能单向流动而且只能在具有父子进程关系的进程间使用。
有名管道:也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量:是一个计数器,可以用来控制多个进程对共享资源的访问,常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列:消息队列是消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号:用于通知接收进程某个事件已经发生,从而迫使进程执行信号处理程序。
共享内存:就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存也是最快的进程间通信方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,比如信号量配合使用,来实现进程间同步和通信。
Socket 套接字:是支持...
线程的同步方式
线程间的同步方式
线程同步机制是指在多线程编程中,为例保证线程之间的互不干扰,而采用的一种机制。常见的线程同步机制有以下几种:
互斥锁:是最常见的线程同步机制。它允许只有一个线程同时访问被保护的临界区(共享资源)。
读写锁:允许多个线程同时读取共享资源,但只允许一个线程写入资源。
条件变量:用于线程间通信,允许一个线程等待某个条件满足,而其他线程可以发出信号通知等待线程。通常与互斥锁一起使用。
信号量:用于控制多个线程对共享资源进行访问的工具。
CPP容器-string
C++中的string容器详解
std::string是C++标准库中用于处理字符串的容器类,它提供了丰富的字符串操作功能,比C风格的字符数组(char[])更安全、更方便。
基本特性
动态大小:string可以动态调整大小,无需手动管理内存
丰富的操作:提供多种字符串操作方法
安全性:自动处理内存分配和释放,减少缓冲区溢出风险
兼容性:可以与C风格字符串互操作
头文件
使用string需要包含头文件:
#include <string>
构造函数
string提供了多种构造函数:
std::string s1; // 默认构造,空字符串std::string s2("Hello"); // 从C风格字符串构造std::string s3(s2); // 拷贝构造std::string s4(5, 'x'); // 构造包含5个'x'的字符串std::string s5(s2.begin(),...
C++中常用的数学函数
在C++中,常用的数学函数主要通过 <cmath>
头文件提供(C++中也可用
<math.h>,但推荐使用C++风格的头文件)。以下是一些常用的数学函数及其说明:
1. 基本运算
函数
描述
示例
abs(x)
绝对值(整数,<cstdlib>)
abs(-5) →
5
fabs(x)
浮点数的绝对值
fabs(-3.14) →
3.14
fmod(x, y)
浮点数取余
fmod(10.5, 3.0) →
1.5
remainder(x, y)
带符号的余数(IEEE规范)
remainder(10.5, 3.0) →
-0.5
fmax(x, y)
返回最大值
fmax(2.0, 3.0) →
3.0
fmin(x, y)
返回最小值
fmin(2.0, 3.0) →
2.0
2....
阿里云oss-picGo-typora搭建图床
Typora 图床设置
前言:因为开始记录博客,发现本地存储的图片路径与服务器路径总是不太一样,总是复制粘贴又不太方便,在此选择搭建图床来进行使用。
软件介绍
我们需要将图片上传到云(专业称图床)上,而云有多种,如下:
阿里云oss
专业,快速,存储空间便宜,一年9块钱40G。但是下行流量需要另外收费。
github...
CPP中sort函数的详细使用指南
C++ sort
算法的详细使用指南
sort 是 C++ STL 中最常用的排序算法,定义在
<algorithm>
头文件中。它使用高效的排序算法(通常是快速排序的变体)对序列进行排序。
基本用法
1. 默认排序(升序)
#include <algorithm>#include <vector>#include <iostream>int main() { std::vector<int> nums = {4, 2, 5, 3, 1}; // 默认升序排序 std::sort(nums.begin(), nums.end()); for (int num : nums) { std::cout << num << " "; } // 输出: 1 2 3 4 5}
2. 降序排序
#include...
CPP中常用的STL算法
C++ 中常用的 STL 算法
STL (Standard Template Library) 提供了大量实用的算法,主要定义在
<algorithm> 头文件中。以下是一些最常用的 STL
算法:
非修改序列操作
for_each -
对范围内的每个元素应用函数
std::vector<int> v{1, 2, 3};std::for_each(v.begin(), v.end(), [](int i){ std::cout << i << " "; });
all_of/any_of/none_of
- 检查范围中元素是否满足条件
bool all_even = std::all_of(v.begin(), v.end(), [](int i){ return i%2 == 0; });
修改序列操作
copy/copy_if -
复制元素
std::vector<int>...