题目描述

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是第二个,44是第三个,47是第四个

不如将4看成0,7看成1,然后就得到二进制数了

4是0

7是1

可是44也变成0了,这就不太好了...于是想到在所有辛运数字前面加上7(也就是所有二进制前加一个1)这样我们就可以再列出一个表了:

4是10

7是11

44是100

47是101

74是110....哇真的是二进制诶.....所以直接将n像我那样拆分,就可以得到一个二进制串,再将二进制串变成十进制后减一即可。

  1. /**
  2. * 将4和7看成二进制0和1, 4->0 7->1
  3. *
  4. * 一位数有2个 pow(2,1)
  5. * 4->0
  6. * 7->1
  7. *
  8. * 2位数有4个 pow(2,2)
  9. * 44->00
  10. * 47->01
  11. * 74->10
  12. * 77->11
  13. *
  14. * 3位数有8个 pow(2,3)
  15. * 444->000
  16. * 447->001
  17. * 474->010
  18. * 477->011
  19. * 744->100
  20. * 747->101
  21. * 774->110
  22. * 777->111
  23. *
  24. * n位数有pow(2,n)个
  25. *
  26. * 求第k个幸运数,即求k的bits是几位数
  27. * for (i;i++) {
  28. * count += Math.pow(2,i);
  29. * if (k <= count) {
  30. * break;
  31. * }
  32. * }
  33. * bits = i;
  34. */

代码:

  1. public class Main
  2. {
  3. //求出第K个幸运数的“位数”
  4. private static int getBits(int k)
  5. {
  6. int count=0;
  7. int bit=0;
  8. while(count<k)
  9. {
  10. ++bit;
  11. count+=Math.pow(2,bit);
  12. }
  13. return bit;
  14.  
  15. }
  16.  
  17. private static void slove(int[] arr)//static
  18. {
  19.  
  20. for(int i=0;i<arr.length;i++)
  21. {
  22. int bits=getBits(arr[i]);
  23. int addOne=arr[i]+1;
  24. //将十进制数转化为二进制串
  25. String bitStr=Integer.toBinaryString(addOne);
  26. //将二进制串转化为字符数组;
  27. char[] bitArr=bitStr.toCharArray();
  28. //移除二进制串中的最高位的1
  29. char[] reArr=new char[bits];
  30. StringBuilder str=new StringBuilder(bits);
  31. for(int j=0;j<bits;j++)
  32. {
  33. reArr[j]=bitArr[j+1];
  34. //将01串变为47串
  35. if(reArr[j]=='0')
  36. {
  37. str.append('4');
  38. }
  39. else
  40. {
  41. str.append('7');
  42. }
  43.  
  44. }//for
  45.  
  46. System.out.println(str.toString());
  47. }
  48.  
  49. }
  50.  
  51. public static void main(String[] args)
  52. {
  53. Scanner sc=new Scanner(System.in);
  54.  
  55. while(sc.hasNextInt())
  56. {
  57. int arrayNum=sc.nextInt();
  58. int[] inputNum=new int[arrayNum];
  59. for(int i=0;i<arrayNum;i++)
  60. {
  61. inputNum[i]=sc.nextInt();
  62. }
  63.  
  64. slove(inputNum);
  65.  
  66. }//while
  67.  
  68. }

测试效果:

京东2017校园招聘笔试题 【第K个幸运数】的更多相关文章

  1. 2014 WAP校园招聘笔试题

    2014 WAP校园招聘笔试题 Problem's Link:   http://www.doc88.com/p-6751117015483.html WAP公司笔试题 We are planning ...

  2. google2013校园招聘笔试题(全国)

    google2013校园招聘笔试题 1. 单项选择题1.1如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少.关于一下几种典型的数据传输速率:1.使用USB2.0闪存盘,往USB闪存盘上拷贝 ...

  3. Microsoft 2013校园招聘笔试题及解答

    Microsoft 2013校园招聘笔试题及解答 题目是自己做的,求讨论.吐槽.拍砖 1.      Which of the following callingconvension(s) suppo ...

  4. Microsoft2013校园招聘笔试题

    Microsoft2013校园招聘笔试题 继续求拍砖!!!! 1. You are managing the database of a book publichser, you currently ...

  5. C# - 2017微软校园招聘笔试题 之 MS Recognition[待解决]

    MS Recognition 在线提交: hihoCoder 1402 http://hihocoder.com/problemset/problem/1402 类似: OpenJudge - I:P ...

  6. PPS2013校园招聘笔试题

    转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/11473405 一.简答题 (1)一位老师有2个推理能力很强的学生,他告诉 ...

  7. 2012Google校园招聘笔试题

    1.已知两个数字为1~30之间的数字,甲知道两数之和,乙知道两数之积,甲问乙:“你知道是哪两个数吗?”乙说:“不知道”.乙问甲:“你知道是哪两个数吗?”甲说:“也不知道”.于是,乙说:“那我知道了”, ...

  8. 2012Hulu校园招聘笔试题

    一.填空 侧重逻辑思维,没有语言.具体技术考察,大部分属于组合数学.算法.比较基本的知识点有二元树节点树.最小生成树.Hash函数常用方法等. 二.编程题 1.正整数剖分 2.AOE关键路径 3.二元 ...

  9. 2013Hulu校园招聘笔试题

    填空题:1.中序遍历二叉树,结果为ABCDEFGH,后序遍历结果为ABEDCHGF,先序遍历结果为?  FCBADEGH  如下图所示: 2.对字符串HELL0_HULU中的字符进行二进制编码,使得字 ...

随机推荐

  1. Winform窗体关闭时判断是否关闭

    在窗体的关闭事件FormClosing中进行判断,FormClosing事件每当用户关闭窗体时,在窗体已关闭并指定关闭原因前发生. private void Form1_FormClosing(obj ...

  2. Node.js 中MongoDB的基本接口操作

    Node.js 中MongoDB的基本接口操作 连接数据库 安装mongodb模块 导入mongodb模块 调用connect方法 文档的增删改查操作 插入文档 方法: db.collection(& ...

  3. 编写一个make

    一.简介 How to make a "make"?在进行实现前,应该先对make有一个最基本的了解.这里稍作简介:当一个程序的源文件较少时,对其进行修改并重新生成可执行文件并不复 ...

  4. 在c#中把字符串转为变量名并获取变量值的小例子(转)

    public class Program { public string str = "spp"; public string spp = "Hello World!&q ...

  5. MFC 给对话框注册热键

    在头文件中添加: //}}AFX_MSGafx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);//(此行为加入的)BEGIN_MESSAGE_MA ...

  6. 9.Mybatis一级缓存和二级缓存

    所谓的缓存呢?其实原理很简单,就是在保证你查询的数据是正确的情况下,没有去查数据库,而是直接查找的内存,这样做有利于缓解数据库的压力,提高数据库的性能,Mybatis中有提供一级缓存和二级缓存. 学习 ...

  7. tablediff使用方法

    tablediff -sourceserver "db0093\sql2008" -sourcedatabase "testly" -sourcetable & ...

  8. select标签非空验证,第一个option value=""即可

    select标签非空验证,第一个option value=""即可,否则不能验证

  9. 信鸽推送(XGPush)

    先放入两个链接: iOS信鸽接入官方文档:http://developer.qq.com/wiki/xg/iOS接入/iOS%20SDK完整接入/iOS%20SDK完整接入.html 信鸽开放平台:h ...

  10. libcurl教程

    名称 libcurl 的编程教程 目标 本文档介绍使用libcurl编程的一般原则和一些基本方法.本文主要是介绍 c 语言的调用接口,同时也可能很好的适用于其他类 c 语言的接口. 跨平台的可移植代码 ...