题目大意:
给你这样一个序列3, 4, 33, 34, 43, 44, 333, 334, 343, 344, 433, 434, 443, 444, 3333, 3334, 3343, 3344……..,找到其中的规律,输入n,输出对应的数字。
解析:
可以把这个序列等价于一个二进制0, 1, 00, 01, 10, 11,模拟这个序列的生成就ok了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 105;
char buf[N];
int n;
int main() {
while(scanf("%d", &n) != EOF) {
memset(buf, 0, sizeof(buf));
int bit = 2;
while(n - bit > 0) {
n -= bit;
bit *= 2;
}
int end = log2(bit);
for(int i = 0; i < end; i++) {
buf[i] = '3';
}
n--;
for(int i = end-1; n; i--) {
if(n & 1) {
buf[i] = '4';
}
n /= 2;
}
puts(buf);
}
return 0;
}