CSP考綱及高精度計算

2022-05-19 04:36:06 字數 4019 閱讀 7428

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大整數加法題為例)

//

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;

}

2、高精度減法(簡單版,以noi1.6:11大整數減法題為例)

//

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;

}

3、高精度乘法(有兩種:高精度*低精度,高精度*高精度)

(以下**只展示高精度*低精度,以noi1.6:12:計算2的n次方 題為例)

//

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;

}

4、高精度除法(有兩種:高精度/低精度,高精度/高精度)

(以下**只展示高精度/低精度,以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...