#53154: 不用成函式 好像一定會卡一點時間


11115121@gs.ltivs.ilc.edu.tw (資訊甲_21)

學校 : 國立羅東高級工業職業學校
編號 : 239859
來源 : [36.229.216.196]
最後登入時間 :
2024-11-22 20:40:35

原本的寫法
時間過不了 怎麼用都是 TLE

 

import math

def is_prime(n):
            if n < 2:
                return 0

            if n == 2 or n == 3 or n == 5:
                return 1

            if n % 2 == 0:
                return 0
            elif n % 3 == 0:
                return 0
            elif n % 5 == 0:
                return 0

            for j in range(5, int(math.sqrt(n)) + 1, 6):
                if n % j == 0 or n % (j + 2) == 0:
                    return 0
            else:
                return 1

while True:
    try:
        intmp = input().split()
        int1 = int(intmp[0])
        int2 = int(intmp[1])
        ans = 0

        for i in range(int1, int2 + 1):
            if is_prime(i):
                ans += 1

        print(ans)


    except EOFError:
        break
 
 
import math

while True:
    try:
        intmp = input().split()
        int1 = int(intmp[0])
        int2 = int(intmp[1])
        ans = 0

        if int1 - int2 > 1000:
            print(0)
            break

        for i in range(int1, int2 + 1):
            if i < 2:
                continue

            if i == 2 or i == 3 or i == 5:
                ans += 1
                continue

            if i % 2 == 0:
                continue
            elif i % 3 == 0:
                continue
            elif i % 5 == 0:
                continue

            for j in range(5, int(math.sqrt(i)) + 1, 6):
                if i % j == 0 or i % (j + 2) == 0:
                    break
            else:
                ans += 1

        print(ans)

    except EOFError:
        break

新的
把檢查是否為質數的地方改成函式而已
個人感覺效率應該挺接近的

import math

def is_prime(n):
    if n < 2:
        return 0
    if n == 2 or n == 3 or n == 5:
        return 1
    if n % 2 == 0:
        return 0
    if n % 3 == 0:
        return 0
    if n % 5 == 0:
        return 0
    for j in range(5, int(math.sqrt(n)) + 1, 6):
        if n % j == 0 or n % (j + 2) == 0:
            return 0
    return 1

while True:
    try:
        intmp = input().split()
        int1 = int(intmp[0])
        int2 = int(intmp[1])
        ans = 0
        for i in range(int1, int2 + 1):
            if is_prime(i):
                ans += 1
        print(ans)
    except EOFError:
        break

但剛好就這樣過了w

可能是我能力不好 所以有不用函式的方法的話 還請跟我說一下
我想知道其他的解法

#53641: Re: 不用成函式 好像一定會卡一點時間


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-09-21 22:24:46

無函式版: Gist連結

其實再調整一下遍歷方式就可以AC了,不需要真的遍歷每個數字

不過我覺得這就是一坨屎山,一點都不優雅,但確實能 AC 這題

不鼓勵這樣寫,從各方面來說寫在全域都沒有什麼太大的好處

 

在 python 中,把邏輯封裝在函數內確實可以提高執行效率,這題剛好是很好的例子

平常寫一些小程式沒有什麼差,但遇到這題的狀況,需要循環成千上萬次,這個差距就會被放大到肉眼可見的程度

和變量作用域(Scope)有關,訪問區域變量(Local)的速度會比全域變量(Global)快

 

有興趣的話可以參考這篇,寫得很詳細
Why does Python Code Run Faster in a Function? | StackAbuse