/*
* @funcion 京东笔试 找幸运数 4,7,44,47,74,77,444,447
* 第5个幸运数是74 根据此规律找出第k个幸运数。
*
* 思路:1位数有2个幸运数,2位数有4个幸运数,3位数有8个幸运数......故n位数的时候,有2的n次方个幸运数
* 根据k,找出它为几位数,进而得出它是在j位中的第几个数。比如第5个幸运数是74,属于两位数,在两位数中的第3位
* 我们通过2进制(即0,1)来解决问题
* 2位数的2进制,有00,01,10,11,第3个即10,把1作7,0作4,输出便是74.
*/
package String;
import java.util.Scanner;
public class Test {
public static void main(String... args){
Scanner in = new Scanner(System.in);
int m = in.nextInt();
long [] arr = new long[m];
for(int i = 0;i < m;i++){
arr[i] = in.nextLong();
}
in.close();
method(arr);
}
/*
* @param int j 找出第k个幸运数属于j位数 比如第5个幸运数是74,属于两位数
* @param double kth 找出第k个幸运数在j位数中的第几个,比如74在两位数中的第3位
*/
public static void method(long [] arr){
double kth = 0;
int j = 0;
double result = 0;
for(int i = 0;i < arr.length;i++){ StringBuilder sb = new StringBuilder();
while(result<arr[i]){
j++; //求出是几位数
result = Math.pow(2, j) + result;
}
kth = arr[i]+2 - Math.pow(2,j); //求出在j位数的第几个数kth
int kthint = (int)kth -1;
String str = Integer.toBinaryString(kthint); //转成2进制数
/*
* 当j=3,kth=1时,kth-1转换成2进制为0,故需补两个0在前面
*/
for(int k = str.length();k < j;k++){
sb.append("0");
}
sb.append(str);
System.out.println(sb.toString().replace('1', '7').replace('0', '4')); //输出结果
}
}
}
ps:昨天漏了一步没有ac出来(泪奔.....),今天找了找原因,重新写了一下