c++给定一个长度为n(0< n< =100000)的序列,保证每一个序列中的数字a[i]是正整数 ,编程要求求出整个序列中第k大的数字减去第k小的数字的值m,并判断m是否为质数。(0< k< =n)
时间: 2024-02-11 10:07:41 浏览: 102
C++计算一个数字的二进制中0或1的个数原理及代码
5星 · 资源好评率100%
好的,下面是C++代码实现:
```c++
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
// 快速选择算法
int quickSelect(vector<int>& nums, int left, int right, int k) {
if (left == right) { // 只有一个元素,直接返回
return nums[left];
}
// 随机选择一个枢轴元素
int pivotIndex = left + rand() % (right - left + 1);
int pivot = nums[pivotIndex];
// 将序列分为两部分
swap(nums[pivotIndex], nums[right]); // 将枢轴元素放到最右边
int i = left, j = right;
while (i < j) {
while (i < j && nums[i] < pivot) {
i++;
}
while (i < j && nums[j] >= pivot) {
j--;
}
swap(nums[i], nums[j]);
}
swap(nums[i], nums[right]); // 将枢轴元素放到正确的位置
// 判断枢轴元素的下标
int rank = i - left + 1;
if (k == rank) {
return pivot; // 第k大/小的数就是pivot
} else if (k < rank) {
return quickSelect(nums, left, i - 1, k); // 第k小的数在左半部分
} else {
return quickSelect(nums, i + 1, right, k - rank); // 第k小的数在右半部分
}
}
// 判断一个数是否为质数
bool isPrime(int num) {
if (num < 2) {
return false;
}
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
int main() {
int n, k;
cin >> n >> k;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
// 求第k大的数和第k小的数
int kthSmallest = quickSelect(nums, 0, n - 1, k);
int kthLargest = quickSelect(nums, 0, n - 1, n - k + 1);
// 计算差值m
int m = kthLargest - kthSmallest;
// 判断m是否为质数
if (isPrime(m)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
```
阅读全文