liusu201601大佬
首先來一張圖,很直觀(截止到2023年資料)
下面是收集的一些,我改了一下
加粗表示特別重要,必須掌握
其他表示最好掌握,可能性不是很大,但是某些可以提高程式效率
高精度a.加法
b.減法
c.乘法(應該只會有高精乘單精)
d.高精度除單精 (後面c,d考的可能性較小,應該只考a,b)
排序演算法
a.選擇排序
b.插入排序
c.hash排序
d.歸併排序(單純的排序可能用不到,有快排就行了,但是歸併排序的思想很重要)
e.堆排序
f.快排
字串匹配演算法
a.蠻力法
b.kmp
數論a.歐幾里德演算法(用輾轉相除法求最大公約數)
b.擴充套件歐幾里德演算法 ax+by=c 的正整數
c.素數 o(sqrt(n))
d.篩法求素數
e.快速乘方(位運算+同餘+高精)
樹論a.二叉搜尋樹
b.優先佇列(c++中priority_queue,相當於手動維護的小(大)根堆的資料結構優化)
c.線段樹 (rmq問題建議使用st演算法)
d.平衡樹一種(建議學習sbt)
圖論a.拓撲排序
b.割頂,割邊(橋)
c.強連通分支 o(n)
d.有向無迴路圖的最長路徑
e.尤拉迴路
f.最小生成樹
① prime o(n2)
② kruskal o(m2)
g.次小生成樹
h.最短路徑
① dijkstra
② bellman-ford
③ spfa
④ flyod
單源點最短路徑演算法推薦使用spfa(即使你習慣dijkstra),dijkstra不能有負邊不能有迴路,所以用spfa更保險
計算幾何
a.判斷兩條線段是否相交
b.凸包演算法 o(n)
其他演算法
a.並查集
b.rmq
......
高精度演算法
1、高精度加法(簡單版,以noi1.6:10大整數加法題為例)
//2、高精度減法(簡單版,以noi1.6:11大整數減法題為例)noi1.6:10大整數加法
//題解:高精度入門題:結構體+字元轉換+進製
#include#include
struct nod}a,b;
char s[210
];int
main()
//********************====
//讀入b********************
scanf("
%s",s+1);//
下標從1開始
ns=strlen(s+1); b.n=ns;
for(int i=1;i<=ns;i++)//
字元逆序轉換為數字
//*************************
//模擬加法運算
a.n=a.n>b.n?a.n:b.n;//
確定數字
for(int i=1;i<=a.n;i++)//
暴力加
for(int i=1;i<=a.n;i++)//
處理進製
}//消除前導0
while(a.a[a.n]==0&&a.n>1) a.n--;//
最高位必須非0
//反向輸出
for(int i=a.n;i>=1;i--)
return0;
}
//3、高精度乘法(有兩種:高精度*低精度,高精度*高精度)noi1.6:11大整數減法
//題解:高精度入門題:結構體+字元轉換+借位
#include#include
struct nod}a,b;
char s[210
];int
main()
//********************====
//讀入b********************
scanf("
%s",s+1);//
下標從1開始
ns=strlen(s+1); b.n=ns;
for(int i=1;i<=ns;i++)//
字元逆序轉換為數字
//*************************
//模擬減法運算
for(int i=1;i<=a.n;i++) a.a[i]-=b.a[i];//
暴力減
for(int i=1;i<=a.n;i++)//
處理借位
}//消除前導0
//本題保證a>b,如果不知道大小關係呢?
while(a.a[a.n]==0&&a.n>1) a.n--;//
最高位必須非0
//反向輸出
for(int i=a.n;i>=1;i--) printf("%d"
,a.a[i]);
return0;
}
(以下**只展示高精度*低精度,以noi1.6:12:計算2的n次方 題為例)
//4、高精度除法(有兩種:高精度/低精度,高精度/高精度)noi1.6:12計算2的n次方
//題解:高精度*低精度 +非結構體 +函式
#includeint a[1010],na;//
估算陣列,2的100次不知道是多少位?
//10的100次是1000位,可以了嗎?
void cf(int
x)
for(int i=1;i<=na;i++)//
處理進製
}}int
main()
for(int i=na;i>=1;i--) printf("
%d",a[i]);//
反向輸出
//現在你可以知道2的100次方是多少位了嗎?
return0;
}
(以下**只展示高精度/低精度,以noi1.6:13:大整數的因子 題為例)
//noi1.6:13大整數的因子
//題解:高精度除以低精度:模擬思想
#include#include
char s[210
];int a[210],na,ls=0
; void chu(int
x)
if(k==0
)
}int
main()
for(int i=2;i<=9;i++)
if(ls==0) printf("
none
");
return0;
}
高精度計算
最近做了一些高精度計算問題,一般來說解題辦法都差不多,都是通過字串來操作的,下面是解題模板。清零操作 string clearstr string s if s return s 0 while s.length 0 s 0 0 s.erase 0,1 刪除第乙個零 if s return s 0 ...
高精度計算
include include includeusing namespace std const int l 110 string add string a,string b 只限兩個非負整數相加 nb l int la a.size lb b.size for int i 0 ilb la lb ...
高精度計算
一.高精度儲存 1.如對數採用的字串輸入 include include using namespace std const int n 100 最多100位 int main 2.直接讀入 include using namespace std const int n 100 最多100位 int...