package test;
import java.util.Scanner;
//算法复杂度log(n)
//算法思想:首先判断k是对应多少位数表示,然后再确定k是这个k位数中的第多少个数,转化为二进制0和1的表示,最后将0和1换为4和7
public class Main {
public static void main(String[] args) {
//这里仅仅输出题目的用例
computeLuckNumber(5);
computeLuckNumber(100);
computeLuckNumber(1000000000);
}
private static void computeLuckNumber(int n) {
int count= computeCount(n);
int sumNumber=((int) Math.pow(2, count))-2;//计算位数小于count的所有数的个数,2+2*2+2*2*2+...=2(count)-2;
int reNumber=n-sumNumber-1;//计算n在count位数中是第几个数,因为count位的二进制数有2的count次幂,但是二进制表示为全0到全1因此需要减去1
String string=Integer.toBinaryString(reNumber);
System.out.println("binary:"+string);
//这个数组空间可以不要,直接对string操作
char[] arr=string.toCharArray();
//这里是一个大数问题,用到字符串来保存结果
StringBuilder ss=new StringBuilder();
for(int i=0;i<arr.length;i++){
if(arr[i]=='1'){
ss.append(7);
}
else{
ss.append(4);
}
}
System.out.println(ss.toString());
}
//这个方法用来计算第k个数他所对应的幸运数表示的位数
private static int computeCount(int n) {
int number=n+1;
int count=0;
while(number>0){
number=number/2;
count=count+1;
}
return --count;
}
}