幸運數字---京東2017年在線筆試題

題目描述:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章