解题思路:首先这个题目是多组输入测试(就是因为这个,提交了好几次,主要题目也没有说明),来说说这个题吧:
给定数据量,输入数据就不说了,想必大家早已精通这些了(哈哈);找第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语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:466 |
蓝桥杯历届试题-九宫重排 (C++代码)浏览:2812 |
C语言程序设计教程(第三版)课后习题6.11 (C语言代码)for循环浏览:1178 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:863 |
剪刀石头布 (C语言代码)浏览:802 |
The 3n + 1 problem (C语言代码)浏览:603 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:699 |
矩阵加法 (C语言代码)浏览:1768 |
字符串输入输出函数 (C语言代码)浏览:2605 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:725 |