mo_chi
@mo_chi

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ABC120のB問題が解けない

解決したいこと

https://atcoder.jp/contests/abc120/tasks/abc120_b
AtCoderで上記の問題を解いています。
下の2つの解答を考えたのですが、どちらもWAとなってしまいます。
チャットGPTに聞いても原因がわかりません。
何が原因か教えていただきたいです。

a,b,k = map(int, input().split())
factor_a = set(i for i in range(1,a+1) if a%i == 0)
factor_b = set(j for j in range(1,b+1) if b%j == 0)
commons=list(factor_a.intersection(factor_b))
commons.sort()
print(commons[k-1])
a,b,k = map(int, input().split())
count=0
for i in range(1,101):
  if a%i == 0 & b%i == 0:
    count += 1
    if count==k:
      print(i)
0

3Answer

countの値がkに到達した後もループを続けてしまってますよね。
exit() or return or break等を入れて、処理から抜けないと。

a, b, k = map(int, input().split())
count = 0
for i in reversed(range(1, 101)):
  if a % i == 0 and b % i == 0:
    count += 1
  if count == k:
    print(i)
    exit()   <--- これがないとループが続く
0Like

他の方からも指摘がありますが、「K番目に大きいもの」を聞いているため、大きいものから数えていく必要があります。
1つ目のコードは、以下のように降順に並び替えてそこからK番目を取り出してみてください。

a,b,k = map(int, input().split())
factor_a = set(i for i in range(1,a+1) if a%i == 0)
factor_b = set(j for j in range(1,b+1) if b%j == 0)
commons=list(factor_a.intersection(factor_b))
commons.sort()
commons.reverse() #追加
print(commons[k-1])

2つ目のコードについては2点修正箇所があります。
1点目は上のコードと同じように大きいものから数えていく必要があるため、iを100から探索していく点。
2点目はifの中の&でつないだ2つの条件をそれぞれかっこで括るという点です
2点目についてはかっこで括らないと今回は意図しない挙動となりました。
おそらくpythonの言語の挙動がそういうものなのだと思われます。
(演算子の優先順位の関係が言語によって微妙に異なると思われるため、言語によってはかっこで括る必要がないかもしれない)
また、2つ目のコードはサンプルケースが全て通っていますが、おそらく偶然だと思われます。
以下のコードでK番目を取り出してみてください。

a,b,k = map(int, input().split())
count=0
# 100から探すように修正
for i in reversed(range(1, 101)):
  # 各条件をかっこで括る
  if (a%i == 0) & (b%i == 0):
    count += 1
    if count==k:
      print(i)
0Like

Your answer might help someone💌