运行for循环的运行时错误

时间:2015-03-16 09:40:20

标签: python

我已经使用此代码查找列表中具有squareroot即4 = 2的所有数字。 当我在以下测试用例上运行它时,我收到运行时错误。 我需要知道它为什么会崩溃,因为我在线使用的测试环境似乎不起作用。

import math

for line in fileinput.input():
    if type(line) == str:
        string= line.split(' ')
        if len(string) == 2:
            start,end = int(string[0]),int(string[1])
            counter = 0
            for num in range(start,end+1):
                sqrt,floor = math.sqrt(num),math.floor(math.sqrt(num))
                if sqrt == floor:
                    counter += 1

            print counter

这是测试用例

100
465868129 988379794
181510012 293922871
395151610 407596310
481403421 520201871
309804254 776824625
304742289 566848910
267554756 828997506
387224568 926504395
244571677 871603971
444567315 582147918
334350264 342469009
400474096 410940967
488907300 943628573
26441071 801576263
182001128 267557939
115732998 974318256
192538332 862327048
45429427 307805497
358658006 842644090
92930998 431601473
231163983 893672132
275221547 298953978
351237326 981399371
484598992 985428966
103405553 529324202
37393469 768655346
30179914 482808626
208821550 538302223
154654533 791652309
68424067 854065374
246956110 517538724
51395253 876949418
57778758 368742600
227566632 606529208
360551779 824396068
396042598 543511438
411041425 473345854
469310505 774761014
90386202 342472887
79110819 503433812
444288332 918848597
280603787 548642983
127990618 324129686
479256115 753819852
253766533 449479844
332623760 979143500
122448725 384124626
101854341 491806437
324275294 529171976
378385813 569430598
152484569 322626345
397853336 772523199
126282101 235322141
327610187 686112903
353962429 655163953
391009046 400936407
45488493 815834125
394001259 642294484
111624270 253455511
220990588 255719882
10907106 950118387
177210402 555916808
316351449 741082827
425556581 856116768
421507248 586064719
93888922 642637722
99843590 473754317
8213634 764585393
488097822 840278753
435342015 842508745
349406673 484900634
280010853 370443835
400888260 691956893
421748251 737067324
305905572 386773097
435191289 887843065
260846393 731941575
445631476 519474101
59915010 237909218
306805801 381681659
324432467 859919996
279649964 564769173
118888227 313212102
302008280 466227315
321239164 872789513
207077522 456470830
242838944 464459846
43481253 51762643
208198294 523145398
47696526 364130319
179957324 441551904
50523163 83566712
478585845 765208335
75756080 429669067
475218138 630450638
55559381 939697803
240414829 549868781
420846535 916723099
329104468 908085028
150336667 828238028

错误讯息:

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    for num in range(start,end+1):
MemoryError

2 个答案:

答案 0 :(得分:1)

您内存不足的原因是因为在Python 2中,range会分配一个列表来保存您请求的所有值。如果您要求范围很广,那么您将获得一个非常大的列表。

一种可能的解决方案是使用xrange代替rangexrange返回一个可迭代的对象,它产生每个值,但它不会预先分配所有值,而只是根据需要计算它们。这使得内存密集程度更低。 xrange的行为已成为Python 3中range的行为。

现在,即使使用xrange,您也可能会发现代码运行速度非常慢。这是因为你在非常长的xrange上进行迭代,并执行大量的平方根(这在计算上相当昂贵)。如果你想做得更好,你需要一个新的算法。

一个好的开始就是要意识到xy之间的精确正方形的整数数与sqrt(x)和{{1}之间的整数数相同}}。这根本不需要任何迭代,只需要两个平方根,无论区间大小如何。

因此,不要直接从sqrt(y)循环到start,而只是直接计算结果:

end

答案 1 :(得分:0)

range(start, end + 1)无法在输入案例之间生成所有数字。所以最好使用while循环。

import math
import fileinput


for line in fileinput.input():
    if type(line) == str:
        string= line.split(' ')
        if len(string) == 2:
            start,end = int(string[0]),int(string[1])
            counter = 0
        print start, end + 1
        i = start
        while i <= end:
                sqrt,floor = math.sqrt(i),math.floor(math.sqrt(i))
                if sqrt == floor:
                    counter += 1
        print counter
        i += 1

            print counter