关于高精度和链表的详细讲解(从属于GESP五级)

本章内容

高精度
链表

 

位数再多,只管稳稳进位,终会把答案写满。

一、高精度

1. 什么是高精度

  • 定义

“高精度整数”指不受 C++ 原生整型 (int / long long) 位宽限制,而用数组模拟任意位数的大整数。

  • 必要性

64 位 long long 仅能保存到 9 × 10¹⁸。五级真题里随手就超出:

    • • 2023-12 单选 11 要填写“高精度加法”代码行,默认操作数可达上百位;
    • • 2025-03 单选 15 要补全“高精度乘法”进位处理,测试数据位长同样远超原生类型;
    • • 2024-09 单选 14 直接考察高精度四则运算复杂度与实现要点。
    • • 在组合数、阶乘、超长斐波那契 等场景里也必须使用高精度。

2. 数据结构设计

2.1 存储方案

① 先谈“存储哲学”——把大整数拆成“块”并线性摆放

高精度实质上是把人类熟悉的十进制笔算过程,翻译成 C++ 的数组操作。任何一个千位、万位甚至百万位的十进制整数,都可以视作“若干个低位到高位连续排列的数字块”。高精度使用者的责任,就是决定“每个块存多少信息”、决定“块们的排列方向”,并确保 进位、借位、比较、截零 等操作在这样的布局下都能高效完成。存储方案因此成为高精度体系的基石:如果选得好,后续加减乘除皆可顺滑;若选得拙劣,则会在常数时间和代码复杂度上付出高昂代价。

② “一位一存”——最朴素但也最易懂的方案

最原始的做法是:把十进制的每一位(0‥9)直接存在 int 数组里。假设要存 31415926,则定义 int a[8],把低位 6 放到 a[0](也可以存在 a[1]),再依次存 2、9、5 … 直至最高位 3 存入 a[7]。这种“小端倒序”布局有几大显见好处:

  • • 程序逻辑几乎与手算一一对应:加减从 a[0] 开始循环,满 10 进 1,直观不易错。
  • • 输出时只需逆序打印即可;调试时直接扫数组就能看到各位数字。
  • • 在五级最常见的“补全代码”单选题中,命题人为了降低阅读门槛,也常给出这种一位一存模板,让考生专注在“进位语句”或“前导零删除”细节。

然而,“一位一存”也有天然瓶颈:循环次数与十进制位数完全等长。5000 位整数相加就得跑 5000 次循环,乘法则是平方级——两数都是 5000 位时,朴素乘法将运行 25 000 00 次乘-加-进位,极容易被 OJ 的 1 s 时限卡住。再者,同样 5000 位数字,数组占 5000×4 B≈20 KB,乘法的中间数组更大,对高速缓存不友好。

在实际使用者中,若题目已声明“输入位数 ≤ 2000”且只牵涉加法或减法,使用一位一存完全能 AC;若涉及乘法、尤其是阶乘、快速幂等 量级循环,则需要考虑更高效的“块存储”。

③ 升级一步:十进制“块”存储,为什么是 10⁴ 或 10⁹?

所谓块存储,就是把若干位十进制数字打包进一个元素。32 位平台常用 BASE=10 000(4 位),因为 9999×9999 不会溢出 32 位有符号整型。64 位平台可提到 BASE=1 000 000 000(9 位);999 999 999×999 999 999≈10¹⁸ 仍落在 64 位无符号范围,但若要存进位之和就需要 long long 或加上额外 carry。对比单独一位,这样做的优势肉眼可见:

  • 位数压缩:原本 5000 位 → ceil(5000/9)=556 块;循环立减 9 倍。
  • Cache 友好:数据更紧凑,CPU 每次读入一次 cache line 可以操作更多“有效位”,缓存命中率提升。
  • 乘法加速:乘法内部两层循环加进位处理常数大幅下降,BASE=10⁹ 的朴素乘法可轻松处理一万位 × 一万位于 0.5 s 内,而单位存储会超时。

但块也不是越大越好。BASE=10¹⁰ 会让一次相乘结果溢出 64 位,需要手写 128 位拆分或使用 __int128。竞赛常用 10⁹ 正是折中的“黄金”——既压缩了位数,又能在支持 __int128 的 GNU C++14 下安全地乘完后取低 64 位和进位 64 位。本篇后续给出的数组模板也选用 BASE=10⁹

④ “大端”还是“小端”?倒序到底好在何处?

  • 小端 (Little-Endian) 命名来源于计算机字节序,在高精数组中意味着“低位在下标 0 or 1”。优点:从低到高自然遍历,符合加减乘除的进位传播方向;缺点:打印要倒序。
  • 大端 (Big-Endian) 则高位在 0,下标越大位权越小,打印方便,但每次运算都要从末尾往前走,写法繁琐。

我们常见和常做的,就是以小端基础,倒序适应我们的四则运算。

2.2 统一符号

① 把正负逻辑从核心运算里剥离
加、减、乘、除的本质都发生在“非负绝对值”之间。如果每一步都掺杂正负判断,会让代码分支膨胀、进位逻辑混乱。

② 避免“负零”
若 0 仍保留 s = -1,那么两个“零”比较会出现“‐0 < +0”的假象。统一约定:只要值为 0,就把符号改回 +1

③ 简化比较
先看符号即可粗判大小(正数必然大于负数),只有符号相同才需比较绝对值。

3. 核心算法

3.1 加法

计算 12345 + 789 图解如下:

倒序输出即 12345 + 789 = 13134。

具体题目:只考虑同号,输入两个位数为 的正整数,求它们的和。

下面我们用字符串输入,转数组进行高精度加法:

#include<bits/stdc++.h>
using namespace std;
char a1[305], b1[305];
int a[305], b[305], c[305]; //加法最多进一位
int main(){cin >> a1 >> b1;int la = strlen(a1);int lb = strlen(b1);for(int i = la-1; i >= 0; i--) a[la-1-i] = a1[i] - '0';for(int i = lb-1; i >= 0; i--) b[lb-1-i] = b1[i] - '0';//字符串转数组倒序保存int lc = max(la, lb) + 1;        for(int i = 0; i < lc; i++){    //枚举各位相加c[i] += a[i]+b[i];            //相加,这里建议相加和进位分开写,更清楚不易错if(c[i] >= 10){                //需要进位c[i] -= 10;c[i+1]++;}} while(c[lc] == 0 && lc > 0) lc--;    //去前导零for(int i = lc; i >= 0; i--){    //倒序输出cout << c[i];} return 0;
}
3.2 减法

只考虑同号,输入两个位数为 的正整数,求它们的差,但不确定被减数和减数的大小。

下面我们用字符串输入,转数组进行高精度减法:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 305
string a, b;
int na[MAXN], nb[MAXN], ans[MAXN]; 
bool flag;int main(){cin >> a >> b;if((a < b && a.size() == b.size()) || a.size() < b.size()){swap(a, b);flag = true;}for(int i = a.size(); i > 0; i--) na[i] = a[a.size() - i] - '0';for(int i = b.size(); i > 0; i--) nb[i] = b[b.size() - i] - '0';//字符串转整数数组int maxl = max(a.size(), b.size());//找到两个数中的最大位for(int i = 1; i <= maxl; i++){if(na[i] < nb[i]){na[i + 1] --;na[i] += 10;}ans[i] = na[i] - nb[i];}while(ans[maxl] == 0) maxl--;  //去前导零if(flag == true) cout << "-"; //b>a时,a - b < 0 所以打上负号 for(int i = maxl; i > 0; i--) cout << ans[i];if(maxl < 1) cout << "0";return 0;
}
3.3 乘法

只考虑同号,输入两个位数为 的正整数,求它们的乘积。

下面我们用字符串输入,转数组进行高精度乘法:

#include<bits/stdc++.h>
using namespace std;
char a1[1005], b1[1005];
int a[2005], b[2005], c[2005];
int main(){cin >> a1 >> b1;int la = strlen(a1);int lb = strlen(b1);int x = 0;for(int i = la-1; i >= 0; i--) a[x++] = a1[i] - '0';x=0;for(int i = lb-1; i >= 0; i--) b[x++] = b1[i] - '0';//转整数数组int lc = la + lb;for(int i = 0; i < la; i++){        //两数相乘for(int j = 0; j < lb; j++){c[i+j] += a[i]*b[j];        //思考,如果最低位保存在下标 1 会怎么样} }for(int i = 0; i < lc; i++){        //进位c[i+1] += c[i]/10;c[i] = c[i]%10;}while(c[lc]==0 && lc > 0) lc--;    //去前导零for(int i = lc; i >= 0; i--) cout << c[i];return 0;
}
3.4 大整数 ÷ 小整数

给定一个位数 大正整数和一个小正整数 ,大整数除以小整数得到的商和余数分别是多少?

string s; int k;    //输入大整数 s(字符串)和小整数 k
cin >> s >> k;    
int l = s.size(), a = 0, t = 0;
for (int i = 0; i < l; i++){a = a*10 + s[i] - '0';        //未除尽的数到下一位 *10if (a >= k){                //能除则输出值 和 计算未除尽的数cout << a/k;a %= k;t = 1;}else if (t) cout << 0;        //出现过商才会出现0,防止有前导零
}
cout << " " << a << endl;
3.5 其它常用扩展

功能

代码思路

modInt(a,m)

逐位 %m 累积余数

快速幂 powBig(a,k)

大数乘法 × 指数二分

阶乘 fact(n)

循环 mul(ans,i)


4. 复杂度 & 易错点

运算

时间复杂度

空间

加/减

O(n)

O(n)

O(n²)

O(n)

÷ 小整

O(n)

O(n)

÷ 大整

O(n²)

O(n)

  1. 1. 进位/借位遗漏——考试常用选择题在这里挖坑(见 23-12 单选 11)。
  2. 2. 符号重置——结果为 0 必须让 sgn=1
  3. 3. 前导零——trim() 每次运算后都要调用,否则比较和打印会错。
  4. 4. 先除后乘——计算 LCM 或做 “a*b/gcd” 时先 a/gcd 再乘,防止溢出;这条在高精同样适用。

5. 真题映射与练习建议

知识点

真题位置

建议练习

高精加法核心循环

2023-12 题 11 选择填空

手写 5000 位两数求和

进位处理

2025-03 题 15 选择填空

随机生成 1000 位×1000 位乘法

算法复杂度判断

2024-09 题 14 单选

对比 n² vs Karatsuba 的性能

完整编程

历年五级编程题经常给出“大数阶乘 / 大数相加”

独立实现加、乘、阶乘


二、链表

1. 结点定义

struct Nod{            // 单向链表结点int v;             // 数据域Nod* n;            // 指针域 (next)Nod(int x = 0, Nod* p = nullptr) : v(x),n(p){}
};

说明

  • • 每个结点保存一个整数 v 与一条指向下一结点的指针 n
  • • 头指针 hd 可指向首结点;若链表为空,hd == nullptr

2. 遍历 (输出全部元素)

void prn(Nod* hd){for(Nod* p = hd; p; p = p->n) cout << p->v <<" ";cout << "\n";
}

过程:让游标 p 从头开始,依次沿 n 前进,直到遇到 nullptr 为止。


3. 头插法创建链表

Nod* crt(const vector<int>& a){   // 传入数组生成链表Nod* hd = nullptr;for(int x : a) hd = new Nod(x, hd);     // 新结点指向原头return hd;                         // 返回新头
}

头插的特点:总 O(1) 时间把新元素压到最前面;生成顺序与原数组相反。


4. 尾插法(在末尾追加)

void pus(Nod*& hd,int x){if(!hd){hd = new Nod(x); return; }  // 空链Nod* p = hd;while(p->n) p = p->n;               // 找尾p->n = new Nod(x);
}

尾插需先遍历到尾结点,因此最坏 O(n)。若频繁尾插,可另设尾指针 tl 优化为 O(1)。


5. 查找首个值为 x 的结点

Nod* fnd(Nod* hd, int x){for(Nod* p = hd; p; p = p->n)if(p->v == x) return p;return nullptr;
}

返回:指向匹配结点的指针,若不存在返回 nullptr


6. 在值为 x 的结点之后插入 y

bool ins(Nod* hd, int x, int y){Nod* p = fnd(hd, x);if(!p) return false;               // 未找到p->n = new Nod(y, p->n);return true;
}

步骤

  1. 1. 先调用 fnd 找目标结点 p
  2. 2. 若存在,则建新结点 q,其 n 指向 p->n,然后把 p->n 改为 q
  3. 3. 整体 O(n)(因为查找)。

7. 删除首个值等于 x 的结点

bool era(Nod*& hd, int x){if(!hd) return false;if(hd->v == x){                      // 删除头结点Nod* t = hd;hd = hd->n; delete t;return true;}for(Nod* p = hd; p->n; p = p->n)if(p->n->v == x){Nod* t = p->n;p->n = t->n; delete t;return true;}return false;                      // 未找到
}
  • • 需要额外保存前驱指针。
  • • 释放内存后确保断链。

8. 销毁整条链表(防内存泄漏)

void clr(Nod*& hd){while(hd){Nod* t = hd;hd = hd->n;delete t;}
}

小结

  • 创建:头插最快;尾插多时可设尾指针。
  • 遍历:沿 next 走到 nullptr
  • 查找 / 插入 / 删除:最坏 O(n);删除需保存前驱。
  • 内存管理:用 new 创建结点后务必在删除或销毁时 delete,否则泄漏。

三、链表拓展

1. 单向链表(Singly Linked List)

1.1 结点结构
struct Nod{int v;          // 数据Nod* n;         // next 指针Nod(int x = 0, Nod* p = nullptr) : v(x),n(p){}
};
1.2 基本操作
  • 头插
void addH(Nod*& h, int x){h = new Nod(x, h);        // 新结点指向旧头
}
  • 按值删除首个 x
bool delV(Nod*& h, int x){if(!h) return 0;if(h->v == x){Nod* t = h; h = h->n; delete t; return 1;}for(Nod* p = h; p->n; p = p->n)if(p->n->v == x){Nod* t = p->n; p->n = t->n; delete t; return 1;}return 0;
}
  • 遍历输出
void prt(Nod* h){for(Nod* p = h; p; p = p->n) cout << p->v <<" ";cout << "\n";
}

时空复杂度:头插 O(1);删除/查找最坏 O(n);空间 O(n)(结点指针域额外占用)。


2. 双向链表(Doubly Linked List)

2.1 定义
struct Dnd{int v;Dnd* l;      // prevDnd* r;      // nextDnd(int x=0) : v(x), l(nullptr), r(nullptr){}
};
2.2 插入与删除要点
  • 插入 p 之后放 q
q->r = p->r;
q->l = p;
if(p->r) p->r->l = q;
p->r = q;
  • 删除结点 p
if(p->l) p->l->r = p->r;
if(p->r) p->r->l = p->l;
delete p;

因为有 prev 指针,删除 不必再找前驱,常数时间完成;代价是每结点多 1 个指针,耗内存加倍。


3. 循环链表(Circular List)

3.1 单向循环
  • • 尾结点 last->n 指回头结点。
  • 遍历for(Nod* p=h; p; p=p->n) { ... if(p->n==h) break; }
3.2 典型场景
  • 约瑟夫问题(Josephus)
  • 操作系统队列(循环就绪队、时间片轮转)

循环链表省去判空:只要持有 last 指针,就能 O(1) 头插尾插;但遍历时务必用“再次到达起点”作为停止条件。


4. OJ 高速写法——“数组模拟链表”

在线评测常限制 new/delete 或追求极限速度,故常用 平行数组 取代指针。

4.1 核心数组
const int N = 1000005;   // 最大结点数
int val[N];              // 数据域
int nxt[N];              // next 下标
int cur = 1;             // 可用的下标指针  [0] 预留作“头结点”
4.2 基本例程
  • 清空
void ini(){nxt[0] = -1;         // 头结点指向实际首元cur = 1;             // 下标 1 起做新结点
}
  • 在 结点 idx 后插入 x
void add(int idx,int x){ // idx 是已有结点下标val[cur] = x;nxt[cur] = nxt[idx];nxt[idx] = cur;++cur;
}
  • 删除 idx 后的结点
void rem(int idx){       // idx 前驱if(nxt[idx] == -1) return;nxt[idx] = nxt[nxt[idx]];
}
  • 遍历
void out(){for(int i = nxt[0]; i != -1; i = nxt[i]) cout << val[i] <<" ";cout << "\n";
}
4.3 特点
  • 全部顺序存储,无动态分配开销,极适合多组数据大规模插删。
  • add / rem 时间 O(1),空间 O(N),且无需垃圾回收。
  • • 常见于 洛谷 P3380AtCoder ABC链表题 等。

5. 小结对比

形式

插入删除

顺序遍历

随机定位

内存开销

单链表

O(1/ n )

O(n)

不支持

1 指针

双向链表

O(1)

O(n)

前驱 O(1)

2 指针

循环链表

O(1)

需哨兵

不常用

同单/双

数组模拟链表

O(1)

O(n)

不支持

2 数组

实战建议

  • 小数据 & 手写题:直接 new/delete 单链表最快写完。
  • 需要 O(1) 删除:双向 or 数组模拟。
  • 大数据连删连插:首选“数组模拟链表”,既快又无碎片。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86180.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python自动化框架选型指南:Selenium/Airflow/Celery该选谁?

在Python自动化领域,Selenium、Airflow和Celery是三个高频出现的工具,但它们的定位和适用场景截然不同。许多开发者在技术选型时容易混淆它们的边界,导致项目架构臃肿或功能不匹配。本文将通过对比分析,帮你明确不同场景下的最佳选择。 一、框架定位与核心功能对比 框架核…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DrinkWater(喝水记录组件)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— DrinkWater组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> 语法结…

UAVAI-YOLO:无人机航拍图像的小目标检测模型

摘要 针对无人机航拍图像目标检测效果差的问题&#xff0c;提出改进的UAVAI-YOLO模型。首先&#xff0c;为使模型获得更加丰富的语义信息&#xff0c;使用改进可变形卷积网络&#xff08;deformable convolutional networks&#xff0c;DCN&#xff09;替换原骨干&#xff08…

Solidity 入门教程(一):Hello Web3,从一个字符串开始!

学习 Solidity 最好的方式&#xff0c;就是写出你的第一个合约&#xff01;在本篇文章中&#xff0c;我们将用极简的代码&#xff0c;通过 Remix 平台快速实现并运行一个 “Hello Web3!” 合约&#xff0c;正式迈入智能合约开发的大门。 一、什么是 Solidity&#xff1f; Sol…

串扰与包地

串扰与包地&#xff1a; 串扰与包地一直是业界非常关心的一个问题&#xff0c;围绕着它们的争论非常多&#xff0c;那到底是包地好 还是不包地好呢?高速先生尝试着从理论和实际测试上来给大家做一个分析。 为了验证它&#xff0c;高速先生做了以下几种情况&#xff0c;如图5-…

leetcode hot 100之:二叉树的最近公共祖先

本来不打算写的哈哈哈但是发现这一道递归我是有思路的&#xff01;&#xff01;自己能想到一些方向&#xff01;我真棒&#xff01;所以记录一下哈哈哈 我的思路&#xff1a; 1、祖先一定是自身或往上找&#xff0c;所以如何逆着走呢&#xff1f; 2、3种情况&#xff1a; 有…

【VUE】某时间某空间占用情况效果展示,vue2+element ui实现。场景:会议室占用、教室占用等。

某时间某空间占用情况效果展示&#xff0c;vue2element ui实现。场景&#xff1a;会议室占用、教室占用等。 场景说明&#xff1a; 现在需要基于vue2和el-table实现每日会议室个时间点占用情况。 已知数据&#xff1a; 1、会议室数据&#xff08;名称&#xff0c;id&#xff…

Git更换源方式记录

本文首发地址&#xff1a;https://www.dawnsite.cn/archives/198.html 该方式前提是本地项目已关联远程仓库&#xff0c;由于业务变更git地址改变 1. 移除本地已有远程仓库 git remote remove origin2. 添加新的远程仓库源 git remote add origin "clone地址"3.一步…

前端面试专栏-主流框架:12. Vue3响应式原理与API

&#x1f525; 欢迎来到前端面试通关指南专栏&#xff01;从js精讲到框架到实战&#xff0c;渐进系统化学习&#xff0c;坚持解锁新技能&#xff0c;祝你轻松拿下心仪offer。 前端面试通关指南专栏主页 前端面试专栏规划详情 Vue3响应式原理与API详解 一、引言 Vue3作为Vue.j…

DAY 37 早停策略和模型权重的保存

早停策略 import torch.nn as nn import torch.optim as optim import time import matplotlib.pyplot as plt from tqdm import tqdm# Define the MLP model class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.fc1 nn.Linear(X_train.shape[1], 10)s…

零基础搭建Spring AI本地开发环境指南

Spring AI 是一个 Spring 官方团队主导的开源项目&#xff0c;旨在将生成式人工智能&#xff08;Generative AI&#xff09;能力无缝集成到 Spring 应用程序中。它提供了一个统一的、Spring 风格的抽象层&#xff0c;简化了与各种大型语言模型&#xff08;LLMs&#xff09;、嵌…

windows登录系统配置双因子认证的解决方案

在数字化浪潮席卷全球的今天&#xff0c;安全如同氧气般不可或缺。Verizon《2023年数据泄露调查报告》指出&#xff0c;80%的黑客攻击与登录凭证失窃直接相关。当传统密码防护变得千疮百孔&#xff0c;企业如何在身份验证的战场上赢得主动权&#xff1f;答案就藏在"双保险…

Java数据结构——线性表Ⅱ

一、链式存储结构概述 1. 基本概念&#xff08;逻辑分析&#xff09; 核心思想&#xff1a;用指针将离散的存储单元串联成逻辑上连续的线性表 设计动机&#xff1a;解决顺序表 "预先分配空间" 与 "动态扩展" 的矛盾 关键特性&#xff1a; 结点空间动态…

技术基石:SpreadJS 引擎赋能极致体验

在能源行业数字化转型的浪潮中&#xff0c;青岛国瑞信息技术有限公司始终以技术创新为核心驱动力&#xff0c;不断探索前沿技术在能源领域的深度应用。其推出的 RCV 行列视生产数据应用系统之所以能够在行业内脱颖而出&#xff0c;离不开背后强大的技术基石 ——SpreadJS 引擎。…

Typora - Typora 打字机模式

Typora 打字机模式 1、基本介绍 Typora 打字机模式&#xff08;Typewriter Mode&#xff09;是一种专注于当前写作行的功能 打字机模式会自动将正在编辑的行保持在屏幕中央&#xff0c;让用户更集中注意力&#xff0c;类似于传统打字机的体验 2、开启方式 点击 【视图】 -…

3.0 compose学习:MVVM框架+Hilt注解调用登录接口

文章目录 前言&#xff1a;1、添加依赖1.1 在settings.gradle.kts中添加1.2 在应用级的build.gradle.kts添加插件依赖1.3 在module级的build.gradle.kts添加依赖 2、实体类2.1 request2.2 reponse 3、网络请求3.1 ApiService3.2 NetworkModule3.3 拦截器 添加token3.4 Hilt 的 …

git学习资源

动画演示&#xff1a;Learn Git Branching 终极目标&#xff08;能看懂即入门&#xff09;&#xff1a;git 简明指南 Git 教程 | 菜鸟教程

C++ 第二阶段:模板编程 - 第一节:函数模板与类模板

目录 一、模板编程的核心概念 1.1 什么是模板编程&#xff1f; 二、函数模板详解 2.1 函数模板的定义与使用 2.1.1 基本语法 2.1.2 示例&#xff1a;通用交换函数 2.1.3 类型推导规则 2.2 函数模板的注意事项 2.2.1 普通函数与函数模板的调用规则 2.2.2 隐式类型转换…

Docker 报错“x509: certificate signed by unknown authority”的排查与解决实录

目录 &#x1f527;Docker 报错“x509: certificate signed by unknown authority”的排查与解决实录 &#x1f4cc; 问题背景 &#x1f9ea; 排查过程 步骤 1&#xff1a;确认加速器地址是否可访问 步骤 2&#xff1a;检查 Docker 是否真的使用了镜像加速器 步骤 3&…

达梦以及其他图形化安装没反应或者报错No more handles [gtk_init_check() failed]

本人安装问题和解决步骤如下&#xff0c;仅供参考 执行 DMInstall.bin 报错 按照网上大部分解决方案 export DISPLAY:0.0 xhost 重新执行 DMInstall.bin&#xff0c;无报错也无反应 安装xclock测试也是同样效果&#xff0c;无报错也无反应 最开始猜测可能是连接工具问题&a…