线性筛:线性时间内求质数

 1 int prime[N];
 2 bool isp[N];
 3 int cnt = 0;
 4 void getp(int x) {
 5     for (int i = 2; i <= x; ++i) {
 6         if (!isp[i])
 7             prime[cnt++] = i;
 8         for (int j = 0; prime[j]*i<=x; ++j) {
 9             isp[prime[j] * i] = true;
10             if (i % prime[j]==0)
11                 break;
12         }
13     }
14 }
15 int main() {
16     int n;
17     cin >> n;
18     getp(n);
19     for (int i = 0; i < cnt; ++i)
20         cout << prime[i] << endl;//表示小于n的质数
21     return 0;
22 }

 gcd求两个数最大公约数

1 int __gcd(int x, int y) {
2     if (x < y)
3         swap(x, y);
4     if (y == 0)
5         return x;
6     return __gcd(y, x % y);
7 }