幸运数字 4和7

news/2025/3/15 16:16:02/

题目描述

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();}
}


测试

//输入
3
5
100
1000000000
//输出
74
744747
77477744774747744747444444447






http://www.ppmy.cn/news/659150.html

相关文章

“四”才是中国人的吉祥数字!

“四”才是中国人的吉祥数字&#xff01; 数字“8&#xff08;ba&#xff09;”因与“发财”的“发&#xff08;fa&#xff09;”音近而被大多数国人认为是吉祥数字&#xff0c;于是住宅门牌、楼层、车牌、电话…… 只要与数字有关的东西都爱选“8”&#xff0c;趋之若骛&#…

labview 波形图表(waveform Chart)

波形图表&#xff08;waveform Chart&#xff09;是显示一条或多条曲线的特殊数值控件&#xff0c; 一般用于显示以恒定速率采集的数据。 波形图表会在缓冲区保留历史数据并在历史数据后添加新数据。 波形图表的默认数据缓冲区大小为1024个数据点。 &#xff08;右击波形图…

Photoshop透明度网格颜色设置方法

内容提要&#xff1a;关于PS透明度与色域设置&#xff0c;可以到Photoshop“编辑——首选项——透明度与色域”命令里面进行设置.对PS感兴趣的朋友可加 ps学习交流群&#xff1a;142574315 分享这篇教程首先是感谢部落窝《零基础到淘宝设计师》班级的主讲老师&#xff0c;在这个…

PS里栅格化的含义

&#xfeff;&#xfeff; 转载自&#xff1a;http://www.dzwebs.net/3529.html 当我们在PS中处理文字图层的时候&#xff0c;通常会使用到文字的栅格化功能。那么&#xff0c;PS里面的栅格化到底有什么作用呢&#xff1f;我们为什么要使用栅格化这个功能呢&#xff1f; 首先&…

ArcGis 网格制作

转自&#xff1a;http://www.sunzx.net/archive/155.html 在利用ArcGIS处理数据时&#xff0c;有时需要对整个工作区域进行规则网格划分&#xff0c;这个在ArcGIS中是一件非常简单的事情&#xff0c;现在就将利用ArcGIS生成规则网格的步骤详细的介绍一下。 首先我有一个工作的范…

Matlab绘制多个曲线的图及局部放大细节展示

绘制多个曲线的图及局部放大细节展示 在科学研究中&#xff0c;经常需要绘制多个曲线并展示局部放大的细节(如下图)。 本篇博客介绍了如何使用MATLAB绘制多个曲线&#xff0c;并在同一张图中添加局部放大图&#xff0c;以展示具体细节。 示例数据 首先&#xff0c;我们准备…

ps制作网格效果步骤和ps怎么做网格的思路

常看见一些带网格的图片来做背景&#xff0c;那么ps教程中怎么做网格效果的背景图片呢&#xff1f;对PS感兴趣的朋友可加PS学习交流群&#xff1a;142574315 下面是ps制作网格背景图片的制作步骤&#xff1a; 1.在photoshop软件里面&#xff0c;新建一个20*20像素的透明文件。 …