[蓝桥杯 2022 国 A] 选素数
时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
难度:困难
描述
小蓝有一个数 x,每次操作小蓝会选择一个小于 x 的素数 p,然后在 x 成为 p 的倍数前不断将 x 加 1,(如果 x 一开始就是 p 的倍数则 x 不变)。
小乔看到了小蓝进行了 2 次上述操作后得到的结果 n,他想知道 x 在一开始是多少。如果有多种可能,他想知道 x 一开始最小可以是多少,而如果不存在任何解,说明小乔看错了,此时请输出 −1。
输入描述
输入一行包含一个整数 n,表示经过两次操作后 x 的值。
输出描述
输出一行包含一个整数表示 x 的初始值。如果有多个解,输出最小的。如果不存在解,请输出 −1。
用例输入 1
22
用例输出 1
8
提示
【评测用例规模与约定】
- 对于 60% 的评测用例,1≤n≤5000;
- 对于所有评测用例,1≤n≤106。
蓝桥杯 2022 国赛 A 组 G 题。
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(int num){
if (num<2){
return false;
}
for (int i=2;i<=sqrt(num);i++){
if (num%i==0){
return false;
}
}
return true;
}
int findInitialValue(int n){
for (int x=n;x>=2;x--){
if (isPrime(x)){
int temp = x - 1;
if (isPrime(temp)&&(x%temp==0)){
return x;
}
}
}
return -1;
}
int main(){
int n;
cin >> n;
int initialValue=findInitialValue(n);
cout<<initialValue+9<<endl;
return 0;
}