解题思路:首先这个题目是多组输入测试(就是因为这个,提交了好几次,主要题目也没有说明),来说说这个题吧:

                给定数据量,输入数据就不说了,想必大家早已精通这些了(哈哈);找第k大数和第k小数,自然首先就是排序,排序最基本得冒泡排序应该都会,我这里是用的数C++的库函数;对于一个已经排序好的数组(假设从大到小),第k大数就是数组中第k个数,即a[k-1],第k小的数就是倒着数第k个数,即a[n-k];看看图理解一下:

             数组(a)下标:            0      1      2      3      4

        数组下标对应的值:            5      4      3      2      1 

               上面这个数组是从大到小,第k(假设k=2)大的数就是a[k-1]==a[1] == 4;第k小的数就是a[n-k]==a[5-2]==a[3]==2; 则第k最大减第k最小就等于tmp=a[k-1]-a[n-k];


然后就是判断素数了;首先小于2的都不是素数(注意),其次素数是只能被1和本身整除的数,用代码来说就是:

int isprime(int n)
{
	for(int i = 2; i < n; ++i)
	{
		if(n%i == 0)
		{
			return 0;
		}
	}
	return 1;
}

优化一下:

int isprime(int n)
{
	for(int i = 2; i <= floor(sqrt(n)+0.5); ++i)
	{
		if(tmp%i == 0)
		{
			return 0;
		}
	}
	return 1;
}

floor(sqrt(n)+0.5),这里我早习惯这样写(因为浮点数的存储原理),写成sqrt(n)也行,不过追求严谨,就要考虑的多一点。
注意事项:


                            输出一组数据,记得换行!!!!!

参考代码:

#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <functional>
using namespace std;
const int maxn=10001;
int a[maxn];
int main()
{
	int n, m, tmp, fg = 0;
	while(scanf("%d%d", &n, &m) != EOF)
	{
		for(int i = 0; i < n; ++i)
		{
			scanf("%d", &a[i]);
		}
		sort(a, a+n, greater<int>());
		tmp = a[m-1] - a[n-m];
		if(tmp < 2)
		{
			fg = 1;
		}
		for(int i = 2; i <= floor(sqrt(tmp)+0.5); ++i)
		{
			if(tmp%i == 0)
			{
				fg = 1;
				break;
			}
		}
		if(fg)
		{
			printf("NO\n");
		}
		else
		{
			printf("YES\n");
		}
		printf("%d\n", tmp);
	}
	return 0;
}

到此结束,谢谢……

点赞(6)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 3 条评论

spring 5年前 回复TA
不好意思没看到题目后面的解释
spring 5年前 回复TA
你似乎忘记了如果数组中有相同数字的情况
wjy123 5年前 回复TA
for(int i = 2; i <= floor(sqrt(tmp)+0.5); ++i) 为什么这样写