python 编程4,和7 幸运数字

本文介绍了如何使用Python找出特定位置上的幸运数字,这些数字由4和7组成。通过给出的思路和规律,可以计算出第K个幸运数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

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

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

输入

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

输出

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


 思路规律

/*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
  ***      ****         **** 
*/  

先确定位数,然后确定在前半部分还是后半部分,例如k=12,位数可以有两种方法确定
方法一:
<span style="color:#6600cc;">for i in range(0,100000):
    temp1 = pow(2,i)
    temp2 = temp1+pow(2,i+1)
    temp3 = (temp1+temp2)/2
    print temp1,temp2,temp3
    # 奇数4,偶数7
    # 前半4,后半7
    if k>=temp1 and k<=temp3 and k%2==1:
        len = i
        print '最高位=',4,'最低位',4
        break
    elif  k>=temp1 and k>=temp3 and k%2==0:
        len = i
        print '最高位=',7,'最低位',7
        break<span style="font-size: 14px; background-color: rgb(255, 255, 255);">
</span></span>
方法二:
<span style="color:#993399;">for i in xrange(0,count):
            if k<=(pow(2,i)-2):
                # len为第k个数的位数
                len = i-1
                break</span>
<span style="background-color: rgb(102, 255, 153);">然后依次判断最高位是什么</span>
输入十进制数12  求出len=3
12             大于2^3-2+2^2 =10             最高位为7
12-2^3  = 4   小于等于2^2-2+2^1=4             最高位为4
4-2^1=2     大于 2^1-2+2^0=1           最高位是7
12对应的数应该为747
</pre></div><h1 style="margin:0px; padding:0px; font-family:Arial; line-height:26px"><pre name="code" class="python">#-*-coding:utf-8-*
def lucky_number():
    k = int(raw_input('please input k: '))
    count =1000000
    result=[]
    while k>0:
        for i in xrange(0,count):
            if k<=(pow(2,i)-2):
                # len为第k个数的位数
                len = i-1
                break
        #逐步确定最高位,存入列表
        while len>0:
            len=len-1
            # 中间下半部分
            if k>(pow(2,(len+1))-2+pow(2,len)):
                result.append(7)
                k=k-pow(2,(len+1))
            else:
                result.append(4)
                k = k -pow(2,len)
    astr=[str(i) for i in result]
    print ''.join(astr)

if __name__ == "__main__":
    while 1:
        lucky_number()
结果:

please input k: 13
774
please input k: 12
747
please input k: 100
744747
please input k: 100000000
47777747477774444744444447
please input k:


如果正式考试的话raw_input()不要加please input k:提示语言,会编译不通过
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值