vector sieve(int n) {
vector is_prime(n + 1, true);
vector primes;
if (n >= 0) is_prime[0] = false;
if (n >= 1) is_prime[1] = false;
for (int i = 2; i <= n; ++i) {
if (is_prime[i]) {
primes.push_back(i);
}
for (int j = 0; j < primes.size() && i * primes[j] <= n; j++) {
is_prime[i * primes[j]] = false;
if (/* 在此处填入代码 */) break;
}
}
return primes;
}
下面代码实现线性筛(欧拉筛),以筛选出n以内的所有素数。横线处的代码应为()。2分
登录后查看选项
06下面关于埃氏筛法的说法正确的是()。2分
登录后查看选项
07
long long power(long long x, int n) {
if (n == 0) return 1;
long long res = power(x, n / 2);
if (n % 2 == 0) return res * res;
else return res * res * x;
}
下面代码实现了计算x^n的快速幂算法,该算法体现的编程思想是()。2分
登录后查看选项
08
int n = 40;
int cnt = 0;
while (n % 2 == 0) {
cnt++;
n /= 2;
}
cout << cnt;
下面代码用于统计n中因子2出现了多少次。若n=40,输出是()。2分
登录后查看选项
09
int lowerBound(vector& a, int x) {
int l = 0, r = a.size();
while (l < r) {
int mid = l + (r - l) / 2;
if (a[mid] >= x) /* 在此处填入代码 */;
else l = mid + 1;
}
return l;
}
在一个有序数组中查找第一个大于或等于x的元素位置,横线处应填写()。2分
登录后查看选项
10
int binary_cut(vector& wood, int K) {
int l = 1;
int r = 0;
for (int len : wood) r = max(r, len);
while (l < r) {
int mid = l + (r - l) / 2;
if (check(wood, K, mid))
/* 在此处填入代码 */;
else l = mid + 1;
}
return l;
}
int partition(vector& arr, int low, int high) {
int pivot = arr[low];
int i = low, j = high;
while (i < j) {
while (i < j && arr[j] >= pivot) j--;
while (i < j && arr[i] <= pivot) i++;
if (i < j) swap(arr[i], arr[j]);
}
// 在此处填入代码
return i;
}
下面代码段实现了快速排序的划分操作(以首元素为基准),横线处代码应填入()。2分
登录后查看选项
12下面哪句话最符合归并排序的思想?()2分
登录后查看选项
13
const int MAXN = 100005;
int a[MAXN];
int tempArr[MAXN];
void mergeArray(int left, int mid, int right) {
int i = left;
int j = mid + 1;
int k = left;
while (i <= mid && j <= right) {
if (a[i] <= a[j]) {
tempArr[k++] = a[i++];
} else {
tempArr[k++] = a[j++];
}
}
while (i <= mid) {
tempArr[k++] = a[i++];
}
while (j <= right) {
tempArr[k++] = a[j++];
}
for (int p = left; p <= right; p++) {
a[p] = tempArr[p];
}
}
void mergeSort(int left, int right) {
if (left >= right) {
return;
}
int mid = left + (right - left) / 2;
mergeSort(left, mid);
mergeSort(mid + 1, right);
mergeArray(left, mid, right);
}
int gcd1(int a, int b) {
return b ? gcd1(b, a % b) : a;
}
int gcd2(int a, int b) {
while (b) {
int t = b;
b = a % b;
a = t;
}
return a;
}
2分
登录后查看选项
19在归并排序的合并操作中,如下代码片段可以正确地将两个已排序的子数组L和R合并回原数组arr中。
void merge(int arr[], int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
int L[n1], R[n2];
for (int i = 0; i < n1; i++) L[i] = arr[left + i];
for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) arr[k++] = L[i++];
else arr[k++] = R[j++];
}
while (i < n1) arr[k++] = L[i++];
while (j < n2) arr[k++] = R[j++];
}