第K个幸运数字(4、7)

题目: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;
}

猜你喜欢

转载自www.cnblogs.com/hcw110/p/10555933.html