題目描述:
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替換,則得到了最終的幸運數字。