#21233: 為什麼總是超時呢?


lalaluk5@ntub.edu.tw (許哲綱)


import sys
import math

for inputValue in sys.stdin:
    startNumber, endNumber = inputValue.split()

    result = []
    for i in range(int(startNumber), int(endNumber)+1):

        sqrtValue = int(math.sqrt(i))

        isPrime = True
        for j in range(2, sqrtValue+1):
            if i % j == 0:
                isPrime = False
                break
        if isPrime:
            result.append(i)

    print(str(len(result)))


 

 

請問各位大大 為什麼這段程式碼總是超時呢?

 

 

 

#21234: Re:為什麼總是超時呢?


asnewchien@gmail.com (david)


你這樣遇到大一點的數字,肯定超時的,
你有沒有發現你的 a010 也比別人慢很多,
去找幾種質數判定法來練習看看。
加油 ^_^

 

#21238: Re:為什麼總是超時呢?


lalaluk5@ntub.edu.tw (許哲綱)


你這樣遇到大一點的數字,肯定超時的,
你有沒有發現你的 a010 也比別人慢很多,
去找幾種質數判定法來練習看看。
加油 ^_^

 

import sys
import math
import time

for inputValue in sys.stdin:
    tStart = time.time()  # 計時開始
    startNumber, endNumber = inputValue.split()

    result = []
    for i in range(int(startNumber), int(endNumber)+1):
        isPrime = True

        for j in range(2, int(math.sqrt(i))):
            # print(str(i) + '-'+str(j)+','+str(i % j))
            if i % j == 0:
                isPrime = False
                break
        if isPrime:
            result.append(i)
    # print(' '.join([str(r) for r in result]))
    tEnd = time.time()  # 計時結束
    print("It cost %f sec" % (tEnd - tStart))  # 會自動做近位
    print(str(len(result)))

 

後來我 加上時間來看到底花了多少時間

 

99999000 100000000  

It cost 0.116392 sec

52

 

這題目說

輸入兩個正整數a,b(1<=a<=b<=100000000)。

保證b-a<=1000

我已經取最大了,只要不到0.2秒

這樣應該不至於會超時吧?

 

還是請問我哪邊誤會了呢?

 

 

 

#21240: Re:為什麼總是超時呢?


asnewchien@gmail.com (david)


題目只有一筆測資嗎。

#21241: Re:為什麼總是超時呢?


asnewchien@gmail.com (david)


還有你寫的  for j in range(2, int(math.sqrt(i)))

如果能略過偶數,時間也可省掉不少。

#21242: Re:為什麼總是超時呢?


lalaluk5@ntub.edu.tw (許哲綱)


題目只有一筆測資嗎。


這我就不曉得了

請問測資要怎麼看呢?

#21243: Re:為什麼總是超時呢?


lalaluk5@ntub.edu.tw (許哲綱)


還有你寫的  for j in range(2, int(math.sqrt(i)))

如果能略過偶數,時間也可省掉不少。

 

import sys
import math
import time

for inputValue in sys.stdin:
    tStart = time.time()  # 計時開始
    startNumber, endNumber = inputValue.split()

    result = []
    for i in range(int(startNumber), int(endNumber)+1):
        isPrime = True
        if i % 2 == 0:
            continue
        if i % 3 == 0:
            continue
        if i % 5 == 0:
            continue
        if i % 7 == 0:
            continue
        if i % 11 == 0:
            continue

        for j in range(2, int(math.sqrt(i))):
            # print(str(i) + '-'+str(j)+','+str(i % j))
            if i % j == 0:
                isPrime = False
                break
        if isPrime:
            result.append(i)
    # print(' '.join([str(r) for r in result]))
    tEnd = time.time()  # 計時結束
    print("It cost %f sec" % (tEnd - tStart))  # 會自動做近位
    print(str(len(result)))

 

 

我擋掉了2、3;5、7、11 還是不能ˊˋ

 

#21266: Re:為什麼總是超時呢?


kobe60116@gmail.com (xlonely_cat 孤貓)


還有你寫的  for j in range(2, int(math.sqrt(i)))

如果能略過偶數,時間也可省掉不少。

 

import sys
import math
import time

for inputValue in sys.stdin:
    tStart = time.time()  # 計時開始
    startNumber, endNumber = inputValue.split()

    result = []
    for i in range(int(startNumber), int(endNumber)+1):
        isPrime = True
        if i % 2 == 0:
            continue
        if i % 3 == 0:
            continue
        if i % 5 == 0:
            continue
        if i % 7 == 0:
            continue
        if i % 11 == 0:
            continue

        for j in range(2, int(math.sqrt(i))):
            # print(str(i) + '-'+str(j)+','+str(i % j))
            if i % j == 0:
                isPrime = False
                break
        if isPrime:
            result.append(i)
    # print(' '.join([str(r) for r in result]))
    tEnd = time.time()  # 計時結束
    print("It cost %f sec" % (tEnd - tStart))  # 會自動做近位
    print(str(len(result)))

 

 

我擋掉了2、3;5、7、11 還是不能ˊˋ

 

2%2=0 2是質數阿\

2,3,5,7,11 也都被你擋掉了