找出一个可被输入数字整除的数字

时间:2017-09-10 19:12:32

标签: python data-structures

给定两个数字a和b,我们必须找到可被a或b整除的第n个数字。

格式如下所示:

输入: 第一行由整数T组成,表示测试用例的数量。 第二行包含三个整数a,b和N

输出 对于每个测试用例,打印第N个 新的数字。

约束:

1≤t≤105

1≤a,b≤104

1≤N≤10

示例输入

1

2 3 10

示例输出

15

解释

可被2整除的数字 或3是:2,3,4,6,8,9,10,12,14,15和第10个数字是15

我的代码

test_case=input()

if int(test_case)<=100000 and  int(test_case)>=1:
    for p in range(int(test_case)):
        count=1
        j=1

        inp=list(map(int,input().strip('').split()))
        if inp[0]<=10000 and  inp[0]>=1 and  inp[1]<=10000 and  inp[1]>=1 and inp[1]<=1000000000 and  inp[1]>=1:
            while(True ):
             if count<=inp[2] :
               k=j
               if j%inp[0]==0 or j%inp[1] ==0:
                   count=count+1
                   j=j+1

               else       :
                   j=j+1
             else:
                 break
            print(k)     
        else:
            break

问题陈述: 对于单个测试用例输入2000 3000 100000,需要一秒多的时间才能完成。如果我能在不到1秒的时间内得到结果,我想要。有没有一个时间有效的方法解决这个问题,可能是我们可以在这里使用一些数据结构和算法吗?

2 个答案:

答案 0 :(得分:0)

我不确定要准确掌握你想要完成的事情。但如果我做对了,答案不是简单的b *(N / 2)?因为你列出了两个数字的倍数,所以第N个总是你列出的第二个数字N / 2.

在您的初始示例中,3 * 10/2 = 15。 在代码示例中,它将是3000 * 100000/2 = 150'000'000

<强>更新 使用set和list计算所需值的代码,以加快计算过程。我仍然想知道,如果有人碰巧偶然发现奇数指数会再次出现...

a = 2000
b = 3000
c = 100000

a_list = [a*x for x in range(1, c)]
b_list = [b*x for x in range(1, c)]

nums = set(a_list)
nums.update(b_list)

nums = sorted(nums)

print(nums[c-1])

此代码在我的笔记本电脑上运行0.14秒。这远远低于要求的阈值。尽管如此,这些值将取决于代码运行的机器。

答案 1 :(得分:0)

对于每两个数字,k将为k=a*ba。在b下只有ks = set(a*1, b*1, ... a*(b-1), b*(a-1), a*b) 的倍数。可以像这样创建这个集合:

a=2, b=3

假设我们取值s = (2,3,4,6)然后c。这些是[1 - 4] => (2,3,4,6) [5 - 8] => 6 + (2,3,4,6) [9 - 12] => 6*2 + (2,3,4,6) ...

的可能值
c

请注意,值以可预测的模式重复。要获得该行,您可以获取s的值并除以集n的长度(称之为c)。设定索引是n的模1。减去问题中使用的1索引的row = floor((c-1)/n) column = `(c-1) % n` result = (a*b)*row + s(column)

a = 2000
b = 3000
c = 100000
s = list(set([a*i for i in range(1, b+1)] + [b*i for i in range(1, a+1)]))
print((((c-1)//len(s)) * (a*b)) + s[(c - 1)%len(s)])

Python impl:

{{1}}