幸运数字 4和7

来源:互联网 发布:好收益网络贷款 编辑:程序博客网 时间:2024/05/16 06:16

题目描述

4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字。

前几个幸运数字为:4,7,44,47,74,77,444,447... 

现在输入一个数字K,输出第K个幸运数。


输入

第一行一个数字T(T<=1000)表示测试数据的组数。对于每组测试数据,输出一个数K


输出

每组数据输出一行,第K个幸运数。


样例输入

3
5
100
1000000000



样例输出

74
744747

77477744774747744747444444447


思路

首先把4和7化为0和1,分别对应起来看,题目就成了求第n位的二进制数,但是这个和普通的二进制数有点不一样。

各种进位的方法都能用的进制转换的方法来套用。

所以首先打个草稿找规律 

/*0           -            -   2的1次-2
//1           4            0
//2           7            1   2的2次-2
//3          44           00
//4          47           01   2的2次-2+2的一次
//5          74           10
//6          77           11   2的3次-2
//7         444          000
//8         447          001
//9         474          010
//10        477          011   2的3次-2+2的两次
//11        744          100
//12        747          101
//13        774          110
//14        777          111   2的4次-2
//15       4444         0000
  ***      ****         **** 
*/

可以看到很明显的几点:

1、当数字有1位时,出现了2次,

      当数字有2位时,出现了4次,

      当数字有n位时,出现了2^n次。

      所以根据这个规律可以根据十进制n来求出二进制有几位。


        for (int i=2;;i++)
            if( n <= pow(2,i)-2 )
              {length=i-1;break;}

      这样就求出了二进制的length。


2、在长度为length的区间内,前面一半的数字都是以4打头,后面都是以7打头,

如果去掉头位并且在10位数中减去相应的次数,就可以变成一个length-1的十进制数。例:

输入十进制数13  求出length=3

13   2^3-2+2^2和 2^4-2之间   二进制为774

减去2^3  得到十进制为5        二进制为74

减去2^2      得到十进制为1                 二进制位4

 

可以看到,当前最高位一步一步被取下来了。所以是一个很容易实现的循环。

方法想好以后,代码很快就来了:


代码

import java.util.Scanner;/** * @author Administrator * */public class LuckyNumber {public static void main(String[] args) {Scanner cin = new Scanner(System.in);int count = 0;int n = 0;while (cin.hasNextInt()) {count = cin.nextInt();int nArr[] = new int[count];for (int i = 0; i < count; i++) {nArr[i] = cin.nextInt();}for (int i = 0; i < count; i++) {StringBuilder resultBuilder = new StringBuilder();n = nArr[i];int length;for (int j = 2;; j++)if (n <= Math.pow(2, j) - 2) {length = j - 1;break;}while (length > 0) {length--;if (n > Math.pow(2, length + 1) - 2 + Math.pow(2, length)) {resultBuilder.append(7);n = n - (int) Math.pow(2, length + 1);} else {resultBuilder.append(4);n = n - (int) Math.pow(2, length);}}System.out.println(resultBuilder.toString());}}cin.close();}}


测试

//输入351001000000000//输出7474474777477744774747744747444444447





0 0