2010-07-29 39 views
7

Vì vậy, tôi đang học python vì vậy tôi sẽ trải qua một số vấn đề về dự án euler. Và tôi không chắc liệu đây có phải là vấn đề về python mà tôi đang gặp hay không, nhưng tôi dường như đang nhận được câu trả lời sai cho vấn đề 53. Đây là một liên kết đến vấn đề http://projecteuler.net/index.php?section=problems&id=53Euler dự án trong python (# 53)

và đây là mã của tôi:

 

from math import factorial 

def ncr(n,r): 
    return (factorial(n)/(factorial(r)*factorial(n-r))) 

i = 0 

for x in range(1,100): 
    for y in range(0,x): 
     if(ncr(x,y) > 1000000): 
      i=i+1 

print i 
 

Tôi nhận được 3982 dường như là câu trả lời sai. Có điều gì đó sai trái mà tôi đang làm cụ thể với python không?

Trả lời

8

range(a, b) không bao gồm b.

+0

Bạn đã được nhịn ăn, mặc dù bạn cũng có phản ứng ngắn nhất = P – Falmarri

+6

Chúng tôi gọi rằng pythonic –

4

Tôi nghĩ rằng mã của bạn là chính xác, tuy nhiên, bạn nên lặp x 100 bao gồm, vì vậy bạn nên sử dụng

for x in range(1,101): 

Hy vọng rằng sẽ giúp. Euler đá!

3

Lưu ý rằng n lớn hơn hoặc bằng 1 nhỏ hơn hoặc bằng 100. Hiện tại, n của bạn đi từ 1 đến 99. Bạn cũng có thể sử dụng xrange.

from math import factorial 

def ncr(n,r): 
    return (factorial(n)/(factorial(r)*factorial(n-r))) 

i = 0 

for x in range(1,101): 
    for y in range(1,x+1): 
     if(ncr(x,y) > 1000000): 
      i=i+1 

print i 
+0

có thể đề cập đến phạm vi trả về một trình lặp trong Python 3 – hop

+0

'xrange (101)' bao gồm '0' – katrielalex

+0

@hop: điểm tốt. @katrielalex: Ah, đúng vậy. Tốt hơn sửa chữa nó sau đó để phạm vi(), mặc dù trong trường hợp này nó không quan trọng như ncr (0,1) là nhỏ hơn 1000000. – vtorhonen

2

Nếu bạn là người mới bắt đầu tôi sử dụng cơ hội này, xem xét tính chất dự án Euler, để cung cấp cho mã hóa thay thế, đó là khép kín và chứng minh phương pháp bảng tra cứu để tăng tốc độ chức năng đệ quy và tiết kiệm các câu trả lời vào từ điển và sử dụng len như đếm.

Hy vọng 4075 là câu trả lời đúng!

from __future__ import division 
factorials={} 

def factorial(n): 
    """ factorial from lookup table ready or generate it to there """ 
    if n not in factorials: 
     factorials[n]=1 if n==0 else n*factorial(n-1) 
    return factorials[n] 

def ncr(n,r): 
    return (factorial(n)/(factorial(r)*factorial(n-r))) 

bigones= [(x,y) for x in range(1,1+100) for y in range(x) if ncr(x,y) > 1000000 ] 

print len(bigones) 
+0

Vâng tôi biết tôi không làm theo cách hiệu quả nhất. Nhưng tôi biết rất nhiều ngôn ngữ khác và tôi chỉ dạy bản thân mình python cho một dự án mà tôi sẽ làm việc tại nơi làm việc. 1 cho hiệu quả mặc dù – Falmarri

+0

Hy vọng bạn có một số ảnh hưởng pythonic từ danh sách hiểu và nếu có giá trị khác làm giai thừa. Bằng cách này giai thừa là chính xác không nổi. Nó không phải là không gian hiệu quả để giữ tất cả các câu trả lời, nhưng nó là tốt đẹp khi bạn muốn tiếp tục thử nghiệm hơn nữa. Nó cũng giữ cho trình dọn dẹp mã. Mã của tôi có 10 dòng bỏ qua các dòng trống và chuỗi tài liệu, nhưng lần nhập đầu tiên chỉ dành cho an toàn và không thực sự cần thiết. 1/3 = 0 trong python 2.6/2.7 nếu không. Mã của bạn có 9 hàng và là mã hóa cơ bản tốt đẹp. Đầu tiên làm cho nó hoạt động, sau đó tối ưu hóa. –

0

Xét đầu vào từ problem specification: "Nó không phải là cho đến khi n = 23, đó là một giá trị vượt quá một triệu", bạn có thể làm cho phạm vi cho bên ngoài 23-101:

for x in range(23,101): 
    ... 

hơn nữa, n qua k có thể tính nhanh hơn mà không tạo ba thừa:

def noverk(n,k): 
    noverk=1 
    if 2*k < n: 
    k=n-k; 
    for i in range(1,n-k+1): 
    noverk *= (i+k) 
    noverk /= i 
    return noverk;