解题思路:
                    题前小磕:这一题一看题目就非常简单,但是为什么我还要写这个题解呢?这个代码改了好久....因为淋过雨,所以要帮你们撑伞!!!(好久没有写题解了,更新一下)

                    大致思路:

                    题目要求求出整个序列中第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.0分

4 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论