题目:4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字,前几个幸运数字为:4,7,44,47,74,77,444,447······
输出第K个数字。
思路是:
将4换成0,7换成1,那么
4, 7, 44, 47, 74, 77, 444, 447... 变成了
0, 1, 00, 01, 10, 11, 000, 001...对应的十进制是:
0, 1, 0, 1, 2, 3, 0, 1...看着没什么规律啊,不好处理,关键的问题在于00,01,000等都因为前边是0失去了本身的大小,那么如果我们在前面都加个1呢?
10, 11, 100, 101, 110, 111, 1000, 1001...变成十进制:
2, 3, 4, 5, 6, 7, 8, 9...
规律出来了。
我要求第K个数字,那么反向推不就得了。
先把K变成二进制(K+1的二进制),然后去掉最前面的1,然后将0替换为4,将1替换为7。答案就出来了。
代码如下:
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll a[1000]; ll f(ll n){ n+=1; int b[1000]; int i,j=0; while(n){ b[j++]=n%2; n/=2; } for(i=j-2;i>=0;i--){ if(b[i]==0) cout<<'4'; else if(b[i]==1) cout<<'7'; } } int main(){ ll t; cin>>t; for(int k=0;k<t;k++){ cin>>a[k]; f(a[k]); cout<<endl; } return 0; }