2018-09-18

2018-09-18  本文已影响0人  翩翩公子银圈圈

小明在课上学习了进制转化。现在他有q个询问,每次询问想问你在1,门区间内,k进制表示中,k-1的数量最多的数是哪个数。比如当k=2时,9的二进制就是1001,那么他就有2个1。
输入:
测试用例包含多组
第一行一个q,表示有q组询问。
接下来q行,每行三个整数k I, r,分别表示进制数,以及查询的范围。满足1<=q<=100000,2<=k<=16,1<=l<=r<=10^16
输出
对于每组询问,输出答案。如果有多个答案,请输出最小的。
示例:
输入:
1
8 1 100
输出:
63
方法1:
基本思路是将上限转换为k进制,判断第一个是否为k-1,如果是,则k-1次数最多的必然是上限,如果不是,k-1次数最多的这是(k-1)*(1+k^1+k^2......k^n),本质为等比数列之和。

print("请输入询问次数")
q=int(input())
# q=1
# k=8
# l=1
# r=100
# 方法1
for i in range(q):
    print("请输入k进值")
    k=int(input())
    print("请输入数值的下限")
    l=int(input())
    print("请输入数值范围的上限")
    r=int(input())
    n=1
    while((((k-1)*(1-pow(k,n)))//(1-k))<=r):
        n+=1
    z=(((k-1)*(1-pow(k,n-1)))//(1-k))
    print(z)

方法2:
思路与1类似,但是这个将上限转换为k进制,进行比较,因此方案1比较方便,介绍这个方案,主要是想介绍函数将十进制转换为任意k进制的功能

def f(n,x):
    #n为待转换的十进制数,x为机制,取值为2-16
    b=[]
    lable=True
    while True:
        s=n//x#商
        y=n%x#余数
        if (lable):
            b=[y]
            lable=False
        else:
            b.append(y)
        if s==0:
            break
        n=s
    # b.reverse()
    return b
print("请输入询问次数")
q=int(input())
for i in range(q):
    print("请输入k进值")
    k=int(input())
    print("请输入数值的下限")
    l=int(input())
    print("请输入数值范围的上限")
    r=int(input())
    m=f(r,k)
    z=0
    if (m[len(m)-1]==k-1):
        for j in range(len(m)):
            z+=(k-1)*pow(k,j)
    else:
        for j in range(len(m)-1):
            z+=(k-1)*pow(k,j)
    print(z)
上一篇下一篇

猜你喜欢

热点阅读