幸运数字---京东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替换,则得到了最终的幸运数字。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值