解题思路:首先这个题目是多组输入测试(就是因为这个,提交了好几次,主要题目也没有说明),来说说这个题吧:
给定数据量,输入数据就不说了,想必大家早已精通这些了(哈哈);找第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;
}到此结束,谢谢……
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复