题目描述:
4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字,前几个幸运数字为:4,7,44,47,74,77,444,447······
输入:
第一行一个数字T(T <= 1000)表示测试数据的组数,对于每组测试数据,输出一个数K(1 <= K <= 10(18) 10的18次幂)
输出:
每组数据输出一行,第K个幸运数字
样例输入:
3
5
100
1000000000
样例输出:
74
744747
77477744774747744747444444447
import java.util.Scanner;
public class LuckyNum {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long[] nums = new long[n];
for (int i = 0; i < n; i++) {
nums[i] = sc.nextLong();
}
String[] result = method_LuckyNum(n, nums);
for (int i = 0; i < n; i++) {
System.out.println(result[i]);
}
sc.close();
}
public static String[] method_LuckyNum(int n, long[] nums) {
String[] output = new String[n];
for (int i = 0; i < n; i++) {
output[i] = transToLuckyNum(nums[i]);
}
return output;
}
private static String transToLuckyNum(long number) {
String binString = Long.toBinaryString(number + 1);
String string = binString.substring(1);
String result = string.replace("0", "4").replace("1", "7");
return result;
}
}
思路:由于输出的结果中只含有4和7,这就很类似二进制数了,我们可以把4和7分别当作0和1,
所以幸运数字的集合4,7,44,47,74,我们可以看做为0,1,00,01,10,但是这样不能转成对应的十进制表示,我们在转换后的每个二进制数前面加一个1,
变成10,11,100,101,110,这样转换成十进制之后就为2,3,4,5,6,这就相当于原来的幸运数字顺序从1,2,3,4,5变成了2,3,4,5,6
所以处理方法是,当求第N个幸运数字时,例如N=100,我们先让N+1=101,对应的二进制数为1100101,然后去掉二进制的第一个数1,则变成了100101,然后将0和1分别用4和7替换,则得到了最终的幸运数字。