题目描述:
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
*** **** ****
*/![]()
//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()
结果:
774
please input k: 12
747
please input k: 100
744747
please input k: 100000000
47777747477774444744444447
please input k:
如果正式考试的话raw_input()不要加please input k:提示语言,会编译不通过