競賽面試演算法必備

2021-10-01 12:01:42 字數 3973 閱讀 1129

#include

intmaxprime

(int n)

if(n >

1) ans = n;

return ans;

}int

main()

輸出n內的素數或者判斷n是不是素數

從2開始一次刪除n內每個素數的倍數,缺點是有的都刪重複了

#include

#define max 100000

int arr[max]=;

//兩寫法思想一樣, 建議第二個

void

is_prime1

(int n)}}

}int

is_prime2

(int n)}}

return arr[n]

;//返回n是不是素數

}int

main()

return0;

}

估算十萬內第n個素數的值,約為 20 * n

只需要篩到n

\sqrt n

n​即可:找出第10001個素數

#include

#define maxn 200000

int prime[maxn +5]

=;void

init()

}for

(int i =

2; i <= maxn;

++i)

return;}

intmain()

時間複雜度和空間複雜度均為 o(n)

原理:給定乙個n,n內每乙個合數都是用它的最大因子(不論素數還是合數)來標記, 依次用 n內的所有數去標記合數(除1外)

從2~n讓每乙個數 i 按順序去乘以當前素數表,如果乘積大於 n 跳出,否則所得乘積被標記為合數,然後素數表中遇到 i 中最小素數時跳出標記(即當前素數表中遇到 i 的因子時就不用再去標記了跳出就行了)

例如輪到12標記合數時,當前素數表為 2, 3, 7, 11。 2 * 12被標記(此時就跳出),若再標記3 * 12 就不對了,因為3 * 12 = 3 * 2 * 6 = 18 * 2, 36是用18標記的

**

找出n內所有在base進製下的回文數

#include

intis_val

(int n,

int base)

return sum == n;

}int

main()

return0;

}

求ab%

p。

a^b\%p。

ab%p。(

0<=a

,b

<=1

09,1

<=p

<=1

09

)(0<=a,b<=10^9,1<=p<=10^9)

(0<=a

,b<=1

09,1

<=p

<=1

09)

#include

using

namespace std;

intmain()

cout << ans;

return0;

}

從檔案內輸入多組大數求和

#include

#define max 55

#include

char str[max +5]

=;int ans[max +5]

=;//ans[0] 記錄位數

intmain()

//處理進製,等

for(

int i =

1; i <= ans[0]

;++i)

}for

(int i = ans[0]

; i > ans[0]

-10; i--

)printf

("\n");

return0;

}

#include

#include

#define max 10000

char str[max +5]

;int ans[max +5]

=;intmain()

//進製處理

for(

int i =

1; i <= ans[0]

;++i)

}for

(int i = ans[0]

; i >=

1; i--

)printf

("\n");

return0;

}

思想同加法,倒著存每位相減再處理進製,大於零不用管,小於零當前位向前借一,此位加十前一位減一,模仿豎式做

#include

#include

using

namespace std;

#define max 100000

intmain()

, a2[max]

=, a[max]=;

cin >> s1 >> s2;

if(s1.

size()

< s2.

size()

)else

if(s1.

size()

== s2.

size()

)else

if(s1 == s2)

}//cout << s1 << endl << s2 << endl;

int l1 = s1.

size()

, l2 = s2.

size()

;for

(int i =

0; i < l1; i++

)for

(int i =

0; i < l2; i++

)//cout << endl;

for(

int i =

1; i <= l1; i++

)for

(int i =

1; i <= l1; i++

)while

(!a[l1]

) l1--

;for

(int i = l1; i >=

1; i--

) cout << endl;

return0;

}

a 的 i 位乘以 b 的 j 位等於 c 的 i + j 位

反者存

#include

#include

#define max 100

char str_a[max +5]

=, str_b[max +5]

;int a[max +5]

, b[max +5]

, c[max *2+

5];int

main()

}//明確一點:a的i位 * b的j位 == c的i+j位

int len_c = len_a + len_b;

//去前導0

while

(!c[len_c]

) len_c--

;for

(int i = len_c; i >=

0; i--

)printf

("\n");

return0;

}

珠心算測試 演算法競賽

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 珠心算是一種通過在腦中模擬算盤變化來完成快速運算的一種計算技術。珠心算訓練,既能夠開發智力,又能夠為日常生活帶來很多便利,因而在很多學校得到普及。某學校的...

面試演算法題

前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...

面試演算法記錄

1.親和數問題 求500萬以內的所有親和數 如果兩個數a和b,a的所有真因數之和等於b,b的所有真因數之和等於a,則稱a,b是一對親和數。例如220和284,1184和1210,2620和2924。思路 220 1 2 4 71 142 sum 284 284 1 2 4 5 10 11 20 22...