P12835 [蓝桥杯 2025 国 B] 蓝桥星数字 题解
额……水篇……题解?
首先我们注意到,蓝桥星数字中的
那么根据这个信息你就可以先判断出第
接着你就是挨个填写了。考虑用
以及这里要记得用一个
嗯,口述起来确实有点绕哈。但是代码就比较一目了然了,很简单,并且为了方便各位理解还加上了详细的注释喵!
#include<bits/stdc++.h>
#define LL long long
#define UInt unsigned int
#define ULL unsigned long long
#define LD long double
#define pii pair<int,int>
#define pLL pair<LL,LL>
#define pDD pair<LD,LD>
#define fr first
#define se second
#define pb push_back
#define isr insert
using namespace std;
LL n,tmp,len,flag;
LL read(){
LL su=0,pp=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')pp=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){su=su*10+ch-'0';ch=getchar();}
return su*pp;
}
int main(){
n=read();
tmp=45,len=2;//蓝桥星数字是没有一位数的
while(n>tmp)n-=tmp,len++,tmp*=5;
//确定第 n 个蓝桥星数字的位数
tmp/=9;//降低到次高位个数
n--;//方便处理取整问题,其实你直接写向上取整应该也是没问题的哈
flag=(n/tmp+1)%2;//记录奇偶性
cout<<n/tmp+1;//最高位单独拎出来算
n%=tmp;//只需要剩下余数用作后续处理
for(int i=1;i<len;i++){//枚举每一位
tmp/=5;//前面是 9 后面都是 5 了哦
cout<<(n/tmp)*2+1-flag;//注意奇偶性
flag=1-flag;//改变奇偶性
n%=tmp;//同样的操作,剩个余数即可
}cout<<"\n";//强迫症输出换行……
return 0;
}
如果本篇题解对你有帮助的话,麻烦你点一个小小的赞,真是太感谢啦!