咖啡


私信TA

用户名:Tianxn

访问量:138180

签 名:

十年OI一场空,不开LL见祖宗。

等  级
排  名 10
经  验 27308
参赛次数 10
文章发表 197
年  龄 22
在职情况 学生
学  校 西安电子科技大学
专  业 软件工程

  自我简介:

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

                给定数据量,输入数据就不说了,想必大家早已精通这些了(哈哈);找第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 人评分

  评论区

不好意思没看到题目后面的解释
2019-03-27 13:46:42
你似乎忘记了如果数组中有相同数字的情况
2019-03-27 13:42:55
for(int i = 2; i <= floor(sqrt(tmp)+0.5); ++i) 为什么这样写
2019-01-30 21:43:59
  • «
  • 1
  • »