[英]find if a number divisible by the input numbers
給定兩個數字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,第十個數字是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秒的時間內獲得結果。 有沒有一種省時的方法來解決這個問題,也許可以在這里使用某些數據結構和算法嗎?
我不確定您到底想完成什么。 但是,如果我做對了,答案不就是b *(N / 2)嗎? 由於您要列出兩個數字的倍數,因此Nth將永遠是您列出的第二個時間乘以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.14s。 大大低於要求的閾值。 但是,此值將取決於運行代碼的機器。
對於每兩個數字,將存在數字k
,使得k=a*b
。 k
下將只有a
和b
倍數。 可以這樣創建該集合:
s = 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
的值除以set s
的長度(稱為n
)。 集合索引是c
乘以n
的模。 在問題中使用1
減去1
的索引。
row = floor((c-1)/n)
column = `(c-1) % n`
result = (a*b)*row + s(column)
Python展示:
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)])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.