当前位置: 首页 > news >正文

进阶数据结构——高精度运算

目录

  • 前言
  • 一、高精度运算的定义与背景
  • 二、高精度运算的实现方式
  • 三、高精度运算的算法实现
  • 四、高精度运算的应用场景
  • 五、代码模版(c++)
  • 六、经典例题
    • 1.[高精度加法](https://www.lanqiao.cn/problems/1516/learning/?page=1&first_category_id=1&name=%E9%AB%98%E7%B2%BE%E5%BA%A6%E5%8A%A0%E6%B3%95)
    • 3.[高精度减法](https://www.luogu.com.cn/problem/P2142)
    • 3.[高精度乘法](https://www.lanqiao.cn/problems/1515/learning/?page=1&first_category_id=1&name=%E9%98%B6%E4%B9%98%E8%AE%A1%E7%AE%97)
    • 4.[高精度除法](https://www.luogu.com.cn/problem/P1480)
  • 七、总结
  • 结语

前言

从这期开始我们就开始进入进阶数据结构的学习了。进阶数据结构中的高精度运算分析,主要聚焦于如何在计算机编程中有效处理超出常规数据类型表示范围的极大或极精确数值。

在这里插入图片描述

一、高精度运算的定义与背景

高精度运算是指在计算机编程中,对超出常规数据类型(如整型、浮点型)所能表示范围的极大或极精确数值进行的各种数学运算。在标准的计算机编程语言中,内置的整数和浮点数类型有其固定的字节数和精度限制,一旦数字过大或精度过高,就会导致溢出或精度丢失的问题。因此,高精度运算技术应运而生。

二、高精度运算的实现方式

高精度运算的实现方式通常涉及自定义数据结构来存储极大数值的每一位。这些数据结构能够模拟人类手算时多位数列的运算规则,使得在理论上能够处理任意长度和精度的数字。常见的实现方式包括:
数组:数组是最常用的数据结构之一,在高精度运算中,可以使用数组来存储每一位数字。例如,在C++中,可以使用std::vector或std::deque等动态数组来分别存储每一位数字。这种方式的好处是访问和修改数字的各个位非常方便,且能够处理任意长度的数字。
字符串:在某些情况下,也可以使用字符串来表示高精度数。字符串的好处是能够直接输入和输出,且不需要考虑数字的位数和进位问题。但是,字符串中的每一位是一个字符,不能直接进行运算,必须先将它转化为数值再进行运算,这增加了运算的复杂性。

三、高精度运算的算法实现

高精度运算的算法实现包括加、减、乘、除等基本运算。以下是对这些运算的简要分析:

加法:高精度加法的基本思想是将两个加数和被加数数组从第一位开始对其,并从第一位开始向后遍历,每一位相加并判断进位,直至到达输入数据末端为止。最后,如果最高位有进位,则需要添加一位。
减法:高精度减法与加法类似,但需要注意处理借位问题。当被减数小于减数时,需要向前一位借位。借位的过程可以通过在该位加上10并减去下一位的值来实现。同时,需要注意处理结果的符号和前导零。
乘法:高精度乘法的基本思想是两个数组相对应位置的数字相乘并考虑进位。可以使用双重循环来遍历两个数组的每一位,并将乘积累加到结果数组中。最后,需要处理进位问题。
除法:高精度除法相对复杂,通常使用长除法或更高效的算法如Karatsuba算法等来实现。除法的关键是逐位确定商的值,并通过减法来确定余数。由于除法运算的复杂性,实现时需要注意处理各种边界情况和异常情况。

四、高精度运算的应用场景

高精度运算在许多领域都有广泛的应用场景,包括但不限于:

科学计算:在科学计算中,经常需要处理小数点后几百位甚至更多的数字,高精度运算能够提供必要的精度和范围支持。
金融计算:在金融领域,高精度运算用于处理大额货币交易和精确计算利息等金融指标。
密码学:在密码学中,高精度运算用于实现加密算法和生成大素数等安全操作。
计算机图形学:在计算机图形学中,高精度运算用于处理浮点数运算中的精度丢失问题,以确保图形的精确渲染。

五、代码模版(c++)

六、经典例题

1.高精度加法

蓝色字体点进去看原题
蓝色字体点进去看原题
蓝色字体点进去看原题

#include<iostream>
#include<cstring>
using namespace std;const int Base = 1000;			//进制数
const int Capacity = 100;		//数组容量class BigInt {
private:int m_size;int m_data[Capacity];void removeLendingZero();				//去除前导0
public:BigInt(int v);				BigInt();								BigInt(char s[]);						//将数字字符串存入数据void print(char end);BigInt(const BigInt& bi);BigInt& operator=(const BigInt& bi);int compare(const BigInt& bi);BigInt operator+(const BigInt& bi);BigInt operator-(const BigInt& bi);BigInt operator*(const BigInt& bi);BigInt operator/(const BigInt& bi);
};BigInt::BigInt() {m_size = 0;memset(m_data, 0, sizeof(m_data));
}BigInt::BigInt(int v) {m_size = 0;while (v > 0) {m_data[m_size++] = v % Base;v /= Base;}
}BigInt::BigInt(char s[]) {m_size = 0;int b = 1;memset(m_data, 0, sizeof(m_data));for (int i = strlen(s) - 1; i >= 0; i--) {m_data[m_size] += (s[i] - '0') * b;b *= 10;if (b >= Base) {b = 1;m_size++;m_data[m_size] = 0;}}if (m_data[m_size] > 0) m_size++;removeLendingZero();
}BigInt::BigInt(const BigInt& bi) {m_size = bi.m_size;memcpy(m_data, bi.m_data, sizeof(bi.m_data));
}BigInt& BigInt::operator=(const BigInt& bi) {m_size = bi.m_size;memcpy(m_data, bi.m_data, sizeof(m_data));return *this;
}void BigInt::print(char end) {cout << (m_size == 0 ? 0 : m_data[m_size - 1]);for (int i = m_size - 2; i >= 0; i--) {for (int j = Base / 10; j > 0; j /= 10) {cout << (m_data[i] / j) % 10;}}cout << end;
}void BigInt::removeLendingZero() {while (m_size > 0 && m_data[m_size - 1] == 0) {m_size--;}
}int BigInt::compare(const BigInt& bi) {if (m_size != bi.m_size)return m_size > bi.m_size ? 1 : -1;for (int i = m_size - 1; i >= 0; i--) {if (m_data[i] != bi.m_data[i]) return m_data[i] > bi.m_data[i] ? 1 : -1;}return 0;
}BigInt BigInt::operator+(const BigInt& bi) {BigInt ret;int carry = 0, i;for (i = 0; i < bi.m_size || i < m_size || carry > 0 ; i++) {/*if (i < m_size)*/carry += m_data[i];/*if (i < bi.m_size)*/carry += bi.m_data[i];ret.m_data[i] = carry % Base;carry /= Base;}ret.m_size = i;		//注意此时ret的长度就是为ireturn ret;
}int main() {char s1[1000], s2[1000];while (cin >> s1 >> s2) {BigInt a(s1), b(s2);(a + b).print('\n');}return 0;
}

3.高精度减法

这一题你们要注意范围长度,还要处理负数的情况

#include<iostream>
#include<cstring>
using namespace std;const int Base = 1000;			//进制数
const int Capacity = 10086 / 3 + 1;		//数组容量class BigInt {
private:int m_size;int m_data[Capacity];void removeLendingZero();				//去除前导0
public:BigInt(int v);				BigInt();								BigInt(char s[]);						//将数字字符串存入数据void print(char end);BigInt(const BigInt& bi);BigInt& operator=(const BigInt& bi);int compare(const BigInt& bi);BigInt operator+(const BigInt& bi);BigInt operator-(const BigInt& bi);BigInt operator*(const BigInt& bi);BigInt operator/(const BigInt& bi);
};BigInt::BigInt() {m_size = 0;memset(m_data, 0, sizeof(m_data));
}BigInt::BigInt(int v) {m_size = 0;while (v > 0) {m_data[m_size++] = v % Base;v /= Base;}
}BigInt::BigInt(char s[]) {m_size = 0;int b = 1;memset(m_data, 0, sizeof(m_data));for (int i = strlen(s) - 1; i >= 0; i--) {m_data[m_size] += (s[i] - '0') * b;b *= 10;if (b >= Base) {b = 1;m_size++;m_data[m_size] = 0;}}if (m_data[m_size] > 0) m_size++;removeLendingZero();
}BigInt::BigInt(const BigInt& bi) {m_size = bi.m_size;memcpy(m_data, bi.m_data, sizeof(bi.m_data));
}BigInt& BigInt::operator=(const BigInt& bi) {m_size = bi.m_size;memcpy(m_data, bi.m_data, sizeof(m_data));return *this;
}void BigInt::print(char end) {cout << (m_size == 0 ? 0 : m_data[m_size - 1]);for (int i = m_size - 2; i >= 0; i--) {for (int j = Base / 10; j > 0; j /= 10) {cout << (m_data[i] / j) % 10;}}cout << end;
}void BigInt::removeLendingZero() {while (m_size > 0 && m_data[m_size - 1] == 0) {m_size--;}
}int BigInt::compare(const BigInt& bi) {if (m_size != bi.m_size)return m_size > bi.m_size ? 1 : -1;for (int i = m_size - 1; i >= 0; i--) {if (m_data[i] != bi.m_data[i]) return m_data[i] > bi.m_data[i] ? 1 : -1;}return 0;
}BigInt BigInt::operator+(const BigInt& bi) {BigInt ret;int carry = 0, i;for (i = 0; i < bi.m_size || i < m_size || carry > 0 ; i++) {/*if (i < m_size)*/carry += m_data[i];/*if (i < bi.m_size)*/carry += bi.m_data[i];ret.m_data[i] = carry % Base;carry /= Base;}ret.m_size = i;		//注意此时ret的长度就是为ireturn ret;
}BigInt BigInt::operator-(const BigInt& bi) {BigInt ret;int carry = 0;ret.m_size = m_size;for (int i = 0; i < m_size; i++) {ret.m_data[i] = m_data[i] - carry;if (i < bi.m_size) ret.m_data[i] -= bi.m_data[i];	//一定是判断减数的每一位减完了没有,如果没有结果值为乱数if (ret.m_data[i] < 0) {ret.m_data[i] += Base;carry = 1;}else carry = 0;		//注意carry一定要重新赋值为0,不然到下一位的时候carry的值就被污染了}ret.removeLendingZero();return ret;
}int main() {char s1[100087], s2[100087];while (cin >> s1 >> s2) {BigInt a(s1), b(s2);if (a.compare(b) >= 0) (a - b).print('\n');else {cout << "-";(b - a).print('\n');}}return 0;
}

3.高精度乘法

#include<iostream>
#include<cstring>
using namespace std;const int Base = 1000;			//进制数
const int Capacity = 1000;		//数组容量class BigInt {
private:int m_size;int m_data[Capacity];void removeLendingZero();				//去除前导0
public:BigInt(int v);				BigInt();								BigInt(char s[]);						//将数字字符串存入数据void print(char end);BigInt(const BigInt& bi);BigInt& operator=(const BigInt& bi);int compare(const BigInt& bi);BigInt operator+(const BigInt& bi) const;BigInt operator-(const BigInt& bi) const;BigInt operator*(const BigInt& bi) const;BigInt operator/(const BigInt& bi) const;
};BigInt::BigInt() {m_size = 0;memset(m_data, 0, sizeof(m_data));
}BigInt::BigInt(int v) {m_size = 0;while (v > 0) {m_data[m_size++] = v % Base;v /= Base;}
}BigInt::BigInt(char s[]) {m_size = 0;int b = 1;memset(m_data, 0, sizeof(m_data));for (int i = strlen(s) - 1; i >= 0; i--) {m_data[m_size] += (s[i] - '0') * b;b *= 10;if (b >= Base) {b = 1;m_size++;m_data[m_size] = 0;}}if (m_data[m_size] > 0) m_size++;removeLendingZero();
}BigInt::BigInt(const BigInt& bi) {m_size = bi.m_size;memcpy(m_data, bi.m_data, sizeof(bi.m_data));
}BigInt& BigInt::operator=(const BigInt& bi) {m_size = bi.m_size;memcpy(m_data, bi.m_data, sizeof(m_data));return *this;
}void BigInt::print(char end) {cout << (m_size == 0 ? 0 : m_data[m_size - 1]);for (int i = m_size - 2; i >= 0; i--) {for (int j = Base / 10; j > 0; j /= 10) {cout << (m_data[i] / j) % 10;}}cout << end;
}void BigInt::removeLendingZero() {while (m_size > 0 && m_data[m_size - 1] == 0) {m_size--;}
}int BigInt::compare(const BigInt& bi) {if (m_size != bi.m_size)return m_size > bi.m_size ? 1 : -1;for (int i = m_size - 1; i >= 0; i--) {if (m_data[i] != bi.m_data[i]) return m_data[i] > bi.m_data[i] ? 1 : -1;}return 0;
}BigInt BigInt::operator+(const BigInt& bi) const {BigInt ret;int carry = 0, i;for (i = 0; i < bi.m_size || i < m_size || carry > 0 ; i++) {if (i < m_size)carry += m_data[i];if (i < bi.m_size)carry += bi.m_data[i];ret.m_data[i] = carry % Base;carry /= Base;}ret.m_size = i;		//注意此时ret的长度就是为ireturn ret;
}BigInt BigInt::operator-(const BigInt& bi) const {BigInt ret;int carry = 0;ret.m_size = m_size;for (int i = 0; i < m_size; i++) {ret.m_data[i] = m_data[i] - carry;if (i < bi.m_size) ret.m_data[i] -= bi.m_data[i];	//一定是判断减数的每一位减完了没有,如果没有结果值为乱数if (ret.m_data[i] < 0) {ret.m_data[i] += Base;carry = 1;}else carry = 0;		//注意carry一定要重新赋值为0,不然到下一位的时候carry的值就被污染了}ret.removeLendingZero();return ret;
}BigInt BigInt:: operator*(const BigInt& bi) const {BigInt ret;ret.m_size = m_size + bi.m_size;for (int i = 0; i < ret.m_size; i++) {ret.m_data[i] = 0;}for (int i = 0; i < m_size; i++) {int carry = 0;for (int j = 0; j < bi.m_size; j++) {ret.m_data[i + j] += m_data[i] * bi.m_data[j] + carry;if (ret.m_data[i + j] >= Base) {carry = ret.m_data[i + j] / Base;ret.m_data[i + j] %= Base;}else carry = 0;}ret.m_data[i + bi.m_size] += carry;}ret.removeLendingZero();return ret;
}int main() {int n;while (cin >> n) {BigInt ret(1);for (int i = 2; i <= n; i++) {ret = ret * i;}ret.print('\n');}return 0;
}

4.高精度除法

#include<iostream>
#include<cstring>
using namespace std;const int Base = 1000;
const int Capacity = 10000;class BigInt {
private:int m_data[Capacity];int m_size;void removeLeadingZeros();public:BigInt();BigInt(int v);BigInt(const BigInt& bi);BigInt(char s[]);BigInt& operator=(const BigInt& bi);void print(char end);int compare(const BigInt& bi);BigInt operator+(const BigInt& bi) const;BigInt operator-(const BigInt& bi) const;BigInt operator*(const BigInt& bi) const;BigInt operator/(const BigInt& bi) const;
};BigInt::BigInt(int v) {m_size = 0;while(v > 0) {m_data[m_size++] = v % Base;v /= Base;}
}BigInt::BigInt() :m_size(0) {memset(m_data, 0, sizeof(m_data));
}BigInt::BigInt(const BigInt& bi) :m_size(bi.m_size) {memcpy(m_data, bi.m_data, sizeof(bi.m_data));
}BigInt::BigInt(char s[]) {m_size = 0;m_data[m_size] = 0;int b = 1;for (int i = strlen(s) - 1; i >= 0; i--) {m_data[m_size] += (s[i] - '0') * b;b *= 10;if (b >= Base) {m_size++;b = 1;m_data[m_size] = 0;}}if (m_data[m_size] > 0) {		//注意m_size可能会比原来多所以要判断m_size++;}removeLeadingZeros();
}BigInt& BigInt::operator=(const BigInt& bi) {m_size = bi.m_size;memcpy(m_data, bi.m_data, sizeof(m_data));return *this;
}void BigInt::print(char end) {cout << (m_size == 0 ? 0 : m_data[m_size - 1]);for (int i = m_size - 2; i >= 0; i--) {for (int j = Base / 10; j > 0; j/=10) {cout << (m_data[i] / j) % 10;}}cout << end;
}int BigInt::compare(const BigInt& bi) {if (m_size != bi.m_size) {return m_size > bi.m_size ? 1 : -1;}for (int i = m_size - 1; i >= 0; i--) {if (m_data[i] != bi.m_data[i])return m_data[i] > bi.m_data[i] ? 1 : -1;}return 0;
}void BigInt::removeLeadingZeros() {while (m_size > 0 && m_data[m_size - 1] == 0) {m_size--;}
}BigInt BigInt::operator+(const BigInt& bi) const {BigInt ret;int i = 0, carry = 0;for (; i < m_size || i < bi.m_size || carry > 0; i++) {if (i < m_size) carry += m_data[i];if (i < bi.m_size) carry += bi.m_data[i];ret.m_data[i] = carry % Base;carry /= Base;}ret.m_size = i;return ret;
}BigInt BigInt::operator-(const BigInt& bi) const {BigInt ret;int carry = 0;ret.m_size = m_size;		//被减数赋值给retfor (int i = 0; i < ret.m_size; i++) {ret.m_data[i] = m_data[i] - carry;if (i < bi.m_size) ret.m_data[i] -= bi.m_data[i];if (ret.m_data[i] < 0) {carry = 1;ret.m_data[i] += Base;}else {carry = 0;}}ret.removeLeadingZeros();return ret;
}BigInt BigInt::operator*(const BigInt& bi) const {BigInt ret;ret.m_size = m_size + bi.m_size;for (int i = 0; i < ret.m_size; i++) {ret.m_data[i] = 0;}for (int i = 0; i < m_size; i++) {int carry = 0;for (int j = 0; j < bi.m_size; j++) {ret.m_data[i + j] += m_data[i] * bi.m_data[j] + carry;if (ret.m_data[i + j] >= Base) {carry = ret.m_data[i + j] / Base;ret.m_data[i + j] %= Base;}else {carry = 0;}}ret.m_data[i + bi.m_size] += carry;}ret.removeLeadingZeros();return ret;
}BigInt BigInt::operator/(const BigInt& bi) const {BigInt ret, carry = 0;int l , r , mid;for (int i = m_size - 1; i >= 0; i--) {carry = carry * Base + m_data[i];l = -1;r = Base;while (l + 1 < r) {mid = (l + r) / 2;if ((bi * mid).compare(carry) <= 0) {l = mid;}else r = mid;}ret.m_data[i] = l;carry = carry - bi * l;}ret.m_size = m_size;ret.removeLeadingZeros();return ret;
}int main() {char s1[10000], s2[10000];while (cin >> s1 >> s2) {BigInt a(s1), b(s2);if (a.compare(b) >= 0)(a - b).print('\n');else {cout << '-';(b - a).print('\n');}}return 0;
}

七、总结

高精度运算是一种重要的进阶数据结构技术,它能够处理超出常规数据类型表示范围的极大或极精确数值。通过自定义数据结构(如数组或字符串)和专门的算法实现(如加法、减法、乘法和除法),高精度运算能够在许多领域提供必要的精度和范围支持。掌握高精度运算技术对于提高程序的性能和效率具有重要意义。

结语

当前进阶的数据结构比之前学的初级数据结构要复杂了,希望大家一定要动手敲一遍代码,敲完之后提交到例题里检查一下是否正确,出现bug不用慌张,耐心差错,这样你的水平才能提升。

在这里插入图片描述

希望大家可以一键三连,后续我们一起学习,谢谢大家!!!

在这里插入图片描述

相关文章:

进阶数据结构——高精度运算

目录 前言一、高精度运算的定义与背景二、高精度运算的实现方式三、高精度运算的算法实现四、高精度运算的应用场景五、代码模版&#xff08;c&#xff09;六、经典例题1.[高精度加法](https://www.lanqiao.cn/problems/1516/learning/?page1&first_category_id1&name…...

第一届“启航杯”网络安全挑战赛WP

misc PvzHE 去这个文件夹 有一张图片 QHCTF{300cef31-68d9-4b72-b49d-a7802da481a5} QHCTF For Year 2025 攻防世界有一样的 080714212829302316092230 对应Q 以此类推 QHCTF{FUN} 请找出拍摄地所在位置 柳城 顺丰 forensics win01 这个软件 云沙盒分析一下 md5 ad4…...

前端八股CSS:盒模型、CSS权重、+与~选择器、z-index、水平垂直居中、左侧固定,右侧自适应、三栏均分布局

一、盒模型 题目&#xff1a;简述CSS的盒模型 答&#xff1a;盒模型有两种类型&#xff0c;可以通过box-sizing设置 1.标准盒模型&#xff08;content-box&#xff09;:默认值&#xff0c;宽度和高度只包含内容区域&#xff0c;不包含内边距、边框和外边距。 2.边框盒模型&a…...

使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践

Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI&#xff0c;是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手&#xff0c;感觉收获还蛮多的&#xff0c;今天来分享下开发过程中的一些经验~ 为啥要做这个…...

Windows程序设计10:文件指针及目录的创建与删除

文章目录 前言一、文件指针是什么&#xff1f;二、设置文件指针的位置&#xff1a;随机读写&#xff0c;SetFilePointer函数1.函数说明2.函数实例 三、 目录的创建CreateDirectory四、目录的删除RemoveDirectory总结 前言 Windows程序设计10&#xff1a;文件指针及目录的创建与…...

Rk3588芯片介绍(含数据手册)

芯片介绍&#xff1a;RK3588是一款低功耗&#xff0c;高性能的处理器&#xff0c;适用于基于arm的PC和边缘计算设备&#xff0c;个人移动互联网设备和其他数字多媒体应用&#xff0c;集成了四核Cortex-A76和四核Cortex-A55以及单独的NEON协处理器 视频处理方面&#xff1a;提供…...

golang 使用双向链表作为container/heap的载体

MyHeap&#xff1a;container/heap的数据载体&#xff0c;需要实现以下方法&#xff1a; Len&#xff1a;堆中数据个数 Less&#xff1a;第i个元素 是否必 第j个元素 值小 Swap&#xff1a;交换第i个元素和 第j个元素 Push&#xff1a;向堆中追加元素 Pop&#xff1a;从堆…...

HTML DOM 修改 HTML 内容

HTML DOM 修改 HTML 内容 引言 HTML DOM(文档对象模型)是浏览器内部用来解析和操作HTML文档的一种机制。通过DOM,我们可以轻松地修改HTML文档的结构、样式和行为。本文将详细介绍如何使用HTML DOM来修改HTML内容,包括元素的增删改查、属性修改以及事件处理等。 1. HTML …...

基于51单片机和WS2812B彩色灯带的流水灯

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码四、主函数总结 系列文章目录 前言 用彩色灯带按自己想法DIY一条流水灯&#xff0c;谁不喜欢呢&#xff1f; 所用单片机&#xff1a;STC15W204S &#xff08;也可以用其他1T单片机&#xff0c;例如&#xff0c;S…...

React第二十八章(css modules)

css modules 什么是 css modules 因为 React 没有Vue的Scoped&#xff0c;但是React又是SPA(单页面应用)&#xff0c;所以需要一种方式来解决css的样式冲突问题&#xff0c;也就是把每个组件的样式做成单独的作用域&#xff0c;实现样式隔离&#xff0c;而css modules就是一种…...

瑞芯微方案:RV1126定制开发板方案定制

产品简介 RV1126 核心板是常州海图电子科技有限公司推出的一款以瑞芯微 RV1126处理器为核心的通用产品&#xff0c;其丰富的设计资源、稳定的产品性能、强力的设计支持&#xff0c;为客户二次开发快速转化产品提供强有力的技术保障。RV1126 核心板集多种优势于一身&#xff0c…...

吴恩达深度学习——有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…...

ollama改模型的存盘目录解决下载大模型报c:盘空间不足的问题

使用Ollama和Open WebUI快速玩转大模型&#xff1a;简单快捷的尝试各种llm大模型&#xff0c;比如DeepSeek r1&#xff0c;非常简单方便&#xff0c;参见&#xff1a;使用Ollama和Open WebUI快速玩转大模型&#xff1a;简单快捷的尝试各种llm大模型&#xff0c;比如DeepSeek r1…...

springboot集成钉钉,发送钉钉日报

目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api&#xff0c;主要用到以下几个api&#xff1a; ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…...

Day49:添加字典元素

在 Python 中&#xff0c;字典是一个可变的数据类型&#xff0c;这意味着你可以随时添加新的键值对。今天我们将学习如何向字典中添加元素。 1. 使用方括号 ([]) 添加新元素 最简单的方法是通过字典的键&#xff0c;使用方括号 [] 来添加新的键值对。如果该键已经存在&#x…...

Keepalived 安装

环境介绍 操作系统Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)内核版本Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52.22.v2207.ky10.aarch64…...

AI应用部署——streamlit

如何把项目部署到一个具有公网ip地址的服务器上&#xff0c;让他人看到&#xff1f; 可以利用 streamlit 的社区云免费部署 1、生成requirements.txt文件 终端输入pip freeze > requirements.txt即可 requirements.txt里既包括自己安装过的库&#xff0c;也包括这些库的…...

C++中vector追加vector

在C中&#xff0c;如果你想将一个vector追加到另一个vector的后面&#xff0c;可以使用std::vector的成员函数insert或者std::copy&#xff0c;或者简单地使用std::vector的push_back方法逐个元素添加。这里我将展示几种常用的方法&#xff1a; 方法1&#xff1a;使用insert方…...

普通人可以从DeepSeek工具获得什么帮助?

普通人可以从DeepSeek工具获得多方面的帮助&#xff0c;具体如下&#xff1a; 学习与教育 DeepSeek可以为学生提供作业辅导、知识点整理、论文思路生成等服务&#xff0c;帮助他们更好地理解和掌握学习内容。例如&#xff0c;学生可以通过DeepSeek获得详细的解题步骤和思路&…...

EtherCAT-快速搭建

EtherCAT-快速搭建 快速简介 快速简介 EtherCAT现场总线协议是由德国倍福公司在2003年提出的&#xff0c;该通讯协议拓扑结构十分灵活&#xff0c;数据传输速度快&#xff0c;同步特性好&#xff0c;可以形成各种网络拓扑结构。倍福公司推出了自己的ASIC专用芯片有ET1100和ET1…...

[Collection与数据结构] B树与B+树

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

《大数据时代“快刀”:Flink实时数据处理框架优势全解析》

在数字化浪潮中&#xff0c;数据呈爆发式增长&#xff0c;实时数据处理的重要性愈发凸显。从金融交易的实时风险监控&#xff0c;到电商平台的用户行为分析&#xff0c;各行业都急需能快速处理海量数据的工具。Flink作为一款开源的分布式流处理框架&#xff0c;在这一领域崭露头…...

【AIGC专栏】AI在自然语言中的应用场景

ChatGPT出来以后&#xff0c;突然间整个世界都非常的为之一惊。很多人大喊AI即将读懂人类&#xff0c;虽然这是一句夸大其词的话&#xff0c;但是经过未来几十年的迭代&#xff0c;ChatGPT会变成什么样我们还真的很难说。在当前生成式内容来说&#xff0c;ChatGPT毫无疑问在当前…...

神经网络|(七)概率论基础知识-贝叶斯公式

【1】引言 前序我们已经了解了一些基础知识。 古典概型&#xff1a;有限个元素参与抽样&#xff0c;每个元素被抽样的概率相等。 条件概率&#xff1a;在某条件已经达成的前提下&#xff0c;新事件发生的概率。实际计算的时候&#xff0c;应注意区分&#xff0c;如果是计算综…...

数科OFD证照生成原理剖析与平替方案实现

数科OFD证照生成原理剖析及C#平替方案实现 1. OFD证照生成原理 OFD&#xff08;Open Fixed-layout Document&#xff09;是一种基于XML的固定版式文档格式&#xff0c;广泛应用于电子发票、电子证照等领域。数科OFD证照生成工具的核心原理包括以下几个方面&#xff1a; OFD文…...

未来无线技术的发展方向

未来无线技术的发展趋势呈现出多样化、融合化的特点&#xff0c;涵盖速度、覆盖范围、应用领域、频段利用、安全性等多个方面。这些趋势将深刻改变人们的生活和社会的运行方式。 传输速度提升&#xff1a;Wi-Fi 技术迭代加快&#xff0c;如 Wi-Fi7 理论峰值速率达 46Gbps&#…...

验证二叉搜索数(98)

98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...

Day51:type()函数

在 Python 中&#xff0c;type() 是一个内置函数&#xff0c;用于返回对象的类型。它可以用于检查变量的类型&#xff0c;也可以用于动态创建新的类型。今天&#xff0c;我们将深入了解 type() 函数的使用方法。 1. 使用 type() 获取变量的类型 最常见的使用方式是将一个对象…...

DeepSeek-R1大模型本地部署及简单测试

目录 DeepSeek-R1大模型本地部署及简单测试背景我的测试环境模型参数选择适用场景参数规模 本地部署安装 DeepSeek-R1大模型本地部署及简单测试 背景 最近deepseek非常火, 要说2025年震惊科技圈的事件要数DeepSeek这个国产AI的横空出世&#xff0c;这是一款免费、开源且隐私优…...

【OpenGL】OpenGL游戏案例(二)

文章目录 特殊效果数据结构生成逻辑更新逻辑 文本渲染类结构构造函数加载函数渲染函数 特殊效果 为提高游戏的趣味性&#xff0c;在游戏中提供了六种特殊效果。 数据结构 PowerUp 类只存储存活数据&#xff0c;实际逻辑在游戏代码中通过Type字段来区分执行 class PowerUp …...

AI学习指南Ollama篇-使用Ollama构建自己的私有化知识库

一、引言 (一)背景介绍 随着企业对数据隐私和效率的重视,私有化知识库的需求日益增长。私有化知识库不仅可以保护企业数据的安全性,还能提供高效的知识管理和问答系统,提升企业内部的工作效率和创新能力。 (二)Ollama和AnythingLLM的结合 Ollama和AnythingLLM的结合…...

灵芝黄金基因组注释-文献精读109

The golden genome annotation of Ganoderma lingzhi reveals a more complex scenario of eukaryotic gene structure and transcription activity 灵芝&#xff08;Ganoderma lingzhi&#xff09;的黄金基因组注释揭示了更复杂的真核基因结构和转录活性情况 摘要 背景 普遍…...

【Proteus仿真】【51单片机】多功能计算器系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键​ 3、加减乘除&#xff0c;开方运算 4、带符号运算 5、最大 999*999 二、使用步骤 基于51单片机多功能计算器 包含&#xff1a;程序&…...

MySQL数据类型转换应注意什么?

文章目录 1. **隐式转换**2. **显式转换**3. **数据截断**4. **字符集与排序规则**5. **日期和时间转换**6. **数值转换**7. **NULL 处理**8. **性能影响**9. **错误处理**10. **函数选择**示例总结 在 MySQL 中进行数据类型转换时&#xff0c;需要注意以下几个关键点&#xff…...

【LLM-agent】(task1)简单客服和阅卷智能体

note 一个完整的agent有模型 (Model)、工具 (Tools)、编排层 (Orchestration Layer)一个好的结构化 Prompt 模板&#xff0c;某种意义上是构建了一个好的全局思维链。 如 LangGPT 中展示的模板设计时就考虑了如下思维链&#xff1a;Role (角色) -> Profile&#xff08;角色…...

【Linux】使用管道实现一个简易版本的进程池

文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程&#xff1a; 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…...

新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战

生成式人工智能的发展既带来了有益的生产力转型机会&#xff0c;也提供了被恶意利用的机会。 最近&#xff0c;Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT&#xff0c;是人工智能用于非法活动的新前沿&#xff0c;可以被用于网…...

力扣017_最小覆盖字串题解----C++

题目描述 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针&#xff0c;一个用于「延伸」现有窗口的 r 指针&#xff0c;和一个用于「收缩」窗口的 l 指针。在任意时刻&#xff0c;只有一个指针运动&#xff0c;而另一个保持静止。我们在 s 上滑动…...

C++:函数

在之前的博客中已经讲过了C语言中的函数概念了&#xff0c;重复的内容就不赘述了。C中的函数在C语言的基础上还有些补充&#xff0c;在这里说明一下。 一、引用 1.引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变…...

linux asio网络编程理论及实现

最近在B站看了恋恋风辰大佬的asio网络编程&#xff0c;质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理&#xff0c;用于复习与分享。大佬的博客&#xff1a;恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中&#xff0c;通常根据事件处理的触…...

第一篇:数据库基础与概念

第一篇&#xff1a;数据库基础与概念 目标读者&#xff1a; 没有接触过数据库的初学者。 内容概述&#xff1a; 在本篇文章中&#xff0c;我们将从零开始&#xff0c;详细介绍数据库的基本概念、常见的数据库管理系统&#xff08;DBMS&#xff09;以及数据库设计的基础知识…...

从理论到实践:Django 业务日志配置与优化指南

在现代 Web 开发中,日志记录是确保系统可维护性和可观测性的重要手段。通过合理的日志配置,我们可以快速定位问题、分析系统性能,并进行安全审计。本文将围绕 Django 框架,详细介绍如何配置和优化业务日志,确保开发环境和生产环境都能高效地记录和管理日志。 © ivwdc…...

基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)

一、引言 1.1 研究背景与意义 在临床用药过程中,药物相互作用(Drug - Drug Interaction, DDI)是一个不可忽视的重要问题。当患者同时服用两种或两种以上药物时,药物之间可能会发生相互作用,从而改变药物的疗效、增加不良反应的发生风险,甚至危及患者的生命安全。例如,…...

常用的 ASCII 码表字符

ASCII&#xff08;美国信息交换标准代码&#xff0c;American Standard Code for Information Interchange&#xff09;是一种字符编码标准&#xff0c;用于表示英文字符、数字、标点符号以及一些控制字符。ASCII 码表包含 128 个字符&#xff0c;每个字符用 7 位二进制数表示&…...

AI大模型开发原理篇-8:Transformer模型

近几年人工智能之所以能迅猛发展&#xff0c;主要是靠2个核心思想&#xff1a;注意力机制Attention Mechanism 和 Transformer模型。本次来浅谈下Transformer模型。 重要性 Transformer模型在自然语言处理领域具有极其重要的地位&#xff0c;为NLP带来了革命性的突破‌。可以…...

Golang 并发机制-2:Golang Goroutine 和竞争条件

在今天的软件开发中&#xff0c;我们正在使用并发的概念&#xff0c;它允许一次执行多个任务。在Go编程中&#xff0c;理解Go例程是至关重要的。本文试图详细解释什么是例程&#xff0c;它们有多轻&#xff0c;通过简单地使用“go”关键字创建它们&#xff0c;以及可能出现的竞…...

NVLink 拓扑、DGX 硬件渲染图

文章目录 一个 server 固定 8 个GPUP100&#xff08;4个NVL&#xff09;V100&#xff08;6个NVL&#xff09;A100&#xff08;12个NVL&#xff09;H100&#xff08;18个NVL&#xff09;【DGX-2 &#xff1a;2018年发布NVSwitch&#xff0c;实现full-mesh】【NVLink 拓扑&#x…...

Python XML 解析

Python XML 解析 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。Python 作为一种功能强大的编程语言,拥有多种解析 XML 的库,如 xml.etree.ElementTree 和 lxml。本文将详细介绍 Python 中 XML 解析的方法、技巧和注意事项,帮助您更好地掌握 XML 数据的…...

java求职学习day22

MySQL 基础 &SQL 入门 1. 数据库的基本概念 1.1 什么是数据库 1. 数据库 (DataBase) 就是 存储 和 管理 数据的仓库 2. 其本质是一个文件系统, 还是以文件的方式,将数据保存在电脑上 1.2 为什么使用数据库 数据存储方式的比较 通过上面的比较 , 我们可以看出 , 使…...

stm32教程:EXTI外部中断应用

早上好啊大佬们&#xff0c;上一期我们讲了EXTI外部中断的原理以及基础代码的书写&#xff0c;这一期就来尝试一下用它来写一些有实际效能的工程吧。 这一期里&#xff0c;我用两个案例代码来让大家感受一下外部中断的作用和使用价值。 旋转编码器计数 整体思路讲解 这里&…...