T2 幸运数https://www.iai.sh.cn/problem/798
题目描述
十进制数字中,只含有 6
与 8
的数字被称作幸运数。将所有的幸运数从小到大排序,第一个幸运数是 6,接下来是
8,66,68,86,88, …
给定 n,请输出第 n 个幸运数。
输入格式
单个整数:表示 n。
输出格式
单个整数:表示第 n 个幸运数。
数据范围
- 30% 的数据,1≤n≤500
- 60% 的数据,1≤n≤1,000,000
- 100%的数据,1≤n≤1,000,000,000,000,000
样例数据
输入:
7
输出:
666
解析
* 两个数字的排列,本质就是二进制,把6当成0,8当成1
* 1:6,2:8,3:66,4:68,5:86,6:88,7:666,……
* 与二进制有出入,需修正。66等价于00,不存在00,在前面补1,变成100
* 实际对应关系是:
* 1:6(10) ,2:8(11),3:66(100) ,4:68(101),5:86(110),6:88(111),7:666(1000),……
* 第 n个数对应的二进制数是 n+1,
* 只需求n+1的二进制,然后去掉最高位,0换成6,1换成8即可。
#include <bits/stdc++.h>
using namespace std;
int main () {
long long n;
int a[100], p=0;
cin>>n;
n++;
while(n>0){
a[p++] = (n%2==0?6:8);
n /= 2;
}
//[0,p)去掉最高位为[0,p-1)
for(int i=p-2; i>=0; i--){
cout<<a[i];
}
return 0;
}