2025年3月GESP真题解析 (后续1)
首先,给大家道歉,这几天没有更新,之前说要给大家讲真题的程序,后来忘了,现在讲第一道。
首先,给大家道歉,这几天没有更新,之前说要给大家讲真题的程序,后来忘了,现在讲第一道。
题目描述
小 A 有一个整数 xxx,他想找到最小的正整数 yyy 使得下式成立:
(x and y)+(x or y)=2025(x \ \operatorname{and} \ y) + (x \ \operatorname{or} \ y) = 2025(x and y)+(x or y)=2025
其中 and\operatorname{and}and 表示二进制按位与运算,or\operatorname{or}or 表示二进制按位或运算。如果不存在满足条件的 yyy,则输出 −1-1−1。
输入格式
一行,一个整数 xxx。
输出格式
一行,一个整数,若满足条件的 yyy 存在则输出 yyy,否则输出 −1-1−1。
输入输出样例 #1
输入 #1
1025
输出 #1
1000
说明/提示
对于所有测试点,保证 0≤x<20250 \leq x < 20250≤x<2025。
(x and y)+(x or y)=2025(x \ \operatorname{and} \ y) + (x \ \operatorname{or} \ y) = 2025(x and y)+(x or y)=2025
其中:
- and\operatorname{and}and 表示按位与运算,运算符为 &\&&。
- or\operatorname{or}or 表示按位或运算,运算符为 ∣|∣。
题目引用洛谷
好了,开始讲题
思路分析
这题简单,说白了只有一个循环与判断,因为题上只有一个条件:(x and y)+(x or y)=2025(x \ \operatorname{and} \ y) + (x \ \operatorname{or} \ y) = 2025(x and y)+(x or y)=2025
xxx也是输入进来的,是已知的,不需要双循环。
但有一个问题,yyy我们不知道是多少,所以要循环,但是循环到多少呢?2025,因为(x and y)+(x or y)=2025(x \ \operatorname{and} \ y) + (x \ \operatorname{or} \ y) = 2025(x and y)+(x or y)=2025,所以yyy大于2025的话,一定不可能成立(x and y)+(x or y)=2025(x \ \operatorname{and} \ y) + (x \ \operatorname{or} \ y) = 2025(x and y)+(x or y)=2025。
上代码!!!
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x,flag=1;
cin>>x;//输入x
for(int y=1;y<=2025;y++)//循环y
{
if((x&y)+(x|y)==2025)//判断
{
flag=0;//做标记,是0说明找得到符合条件的y
cout<<y<<endl;//输出y
}
}
if(flag==1) cout<<-1;//如果找不到输出-1
return 0;
}
或者这样写
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x;
cin>>x;
for(int y=1;y<=2025;y++)
{
if((x&y)+(x|y)==2025)
{
cout<<y<<endl;
return 0;
}
}
cout<<-1;
return 0;
}
为啥能这样,因为符合条件的只有一个,找到后直接结束。
好了,这期就到这里,给小汉堡点个赞与关注,谢谢,下期再见!!!
更多推荐



所有评论(0)