解题思路:
题前小磕:这一题一看题目就非常简单,但是为什么我还要写这个题解呢?这个代码改了好久....因为淋过雨,所以要帮你们撑伞!!!(好久没有写题解了,更新一下)
大致思路:
题目要求求出整个序列中第k大的数字减去第k小的数字的值m,并判断m是否为质数。一看第k大、第k小就知道必须要先排序。其次要知道第k大的数字和第k小的数字对应的下标是多少,第k小的数字下标是 k-1,第k大的下标是 n - k。如果不知道为什么的,建议回去复习一下数组(提示:下标)。这样就能得到需要判断的那个数了(暂时把这个数叫res)。接下来就是判断质数了。这里注意一个细节,就是质数的定义:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。(必须大于1)。而质数的判断方法有好几种,能相信做到这道题的应该都会吧!本题解使用的是优化的暴力筛选法(sqrt函数),如果不懂,就去百度一下吧!!!
具体步骤:
1、排序(使用C语言的同学可以使用冒泡排序法或者快速排序法、C++的同学使用标准库函数sort即可,注意要使用algorithm头文件)
2、得到需要进行判断的数字res。res = nums[n - k] - nums[k - 1]
3、判断是否为质数
注意事项:
1、排序如果使用冒泡排序法或者快速排序法,要注意边界范围,小心越界。(如果不会排序的,可以看我之前写的关于排序的题解,超级详细)
2、在进行质数判断前一定要判断那个数是否大于1(我就是因为,才没有通过)
3、质数判断时,要注意循环条件为i <= (int)sqrt(res),以防49这样的数字判断成质数
参考代码:
C++代码
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 10000;
int nums[N];
bool isprime(int x)
{
if(x <= 1)//紧扣质数定义 如果小于等于1,直接返回false
return false;
else
{
int flag = 1;
for(int i = 2;i <= (int)sqrt(x);i++)
{
if(x % i == 0)
flag = 0;
}
if(flag == 1)
return true;
else
return false;
}
}
int main()
{
int n,k;
cin >> n >> k;
for(int i = 0;i < n;i++)
cin >> nums[i];
sort(nums,nums + n);//进行排序,不要忘了头文件algorithm
int res = nums[n - k] - nums[k - 1];//得到需要进行判断的数字
if(isprime(res))//进行质数判断
{
cout << "YES" << endl;
cout << res << endl;
}
else
{
cout << "NO" << endl;
cout << res << endl;
}
return 0;
}C代码
#include <stdio.h>
#include <math.h>
void quick_sort(int nums[],int l,int r)//快速排序法
{
if(l >= r)
return;
int i = l - 1,j = r + 1,x = nums[(l + r) / 2];
while(i < j)
{
do i++;while(nums[i] < x);
do j--;while(nums[j] > x);
if(i < j)
{
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
quick_sort(nums,l,j);
quick_sort(nums,j + 1,r);
}
int isprime(int x)//质数判断
{
if(x <= 1)//如果小于等于1,直接退出
return 0;
else
{
int flag = 1;
for(int i = 2;i <= (int)sqrt(x);i++)
{
if(x % i == 0)
flag = 0;
}
if(flag == 1)
return 1;
else
return 0;
}
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
static int N = 10000;//防止数组太大,导致爆栈
int nums[N];
for(int i = 0;i < n;i++)
{
scanf("%d",&nums[i]);
}
quick_sort(nums,0,n - 1);//快速排序法
int res = nums[n - k] - nums[k - 1];//得到需要进行判断的数
if(isprime(res))
{
printf("YES\n");
printf("%d\n",res);
}
else
{
printf("NO\n");
printf("%d\n",res);
}
return 0;
}0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复