文章目录
5366. 大小写转换
给定一个由大写字母构成的字符串,请你将其中的每个字符都转换为对应小写字母。
输出大小写转换后得到的新字符串。
输入格式
一个由大写字母构成的字符串。
输出格式
输出大小写转换后得到的新字符串。
数据范围
前 3
个测试点满足,输入字符串的长度范围 [1,10]
。
所有测试点满足,输入字符串的长度范围 [1,100]
。
输入样例:
ABC
输出样例:
abc
cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
int n;
cin >> n;
while (n -- ){
int x;
scanf("%d", &x);
if (x < 2){
cout << "No" << endl;
continue;
}
bool is_prime = false;
for (int i = 2; i <= x / i; i ++){
if (x % i == 0){
cout << "No" << endl;
is_prime = true;
break;
}
}
if (!is_prime) cout << "Yes" << endl;
}
return 0;
}
5367. 不合群数
如果一个正整数无法被 [2,a]
范围内的任何整数整除,则称其为不合群数。
请你计算并输出 [2,b]
范围内的最大不合群数。
提示:10
亿内的最大质数是 999999937
,且相邻质数之间的差值均不超过 300
。
输入格式
共一行,包含两个整数 a,b
。
输出格式
一个整数,表示 [2,b]
范围内的最大不合群数。
如果 [2,b]
范围内不存在不合群数,则输出 -1。
数据范围
前 3
个测试点满足 2≤a≤b≤10
。
所有测试点满足 2≤a≤b≤109
。
输入样例1:
3 6
输出样例1:
5
输入样例2:
3 4
输出样例2:
-1
cpp
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
int a, b;
cin >> a >> b;
while(b > a)
{
// 枚举 (b - 300, b] 这些数
bool flag = false;
for (int j = 2; j <= min(a, b / j); j ++){
if (b % j == 0){
flag = true;
break;
}
}
if (!flag && b > a){
cout << b << endl;
break;
}
b --;
}
if (b <= a) cout << -1 << endl;
return 0;
}
思路
不合群数定义:不被[2, a]中的任意一个数整除
要找到[2, b]中的不合群数,则不合群数一定在[a + 1, b]这个范围内
提示中提到了质数,[a + 1, b]范围内的质数一定是不合群数
题目要找到最大的不合群数,则从b开始倒着寻找最大的数即可
该数必须要>a才满足条件,否则不存在最大的不合群数
- 需要注意,质数一定是不合群数,但是不合群数不一定是质数
因为提示中说10亿内的相邻质数之间的差值均不超过 300,所以要找到最大的质数只需要枚举300个数即可
如何判断质数?
- 试除法
只需要判断到min(a, sqrt(j))
即可
毕竟枚举a还是可能超时的,max(a) = 1e9
严格按照题目要枚举[2, a]
但是如果这个数是质数,即枚举[2, sqrt(j)],一定是不合群数
补充知识点
试除法判定质数
cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
int n;
cin >> n;
while (n -- ){
int x;
scanf("%d", &x);
if (x < 2){
cout << "No" << endl;
continue;
}
bool is_prime = false;
for (int i = 2; i <= x / i; i ++){
if (x % i == 0){
cout << "No" << endl;
is_prime = true;
break;
}
}
if (!is_prime) cout << "Yes" << endl;
}
return 0;
}