2014-05-13 2 views
1

두 개의 숫자 순서에 한계를 두는 것과 관련된 문제에 대한 해결책을 계산하려고합니다.파이썬에서 여러 시퀀스의 전체 숫자 제한을 설정하는 방법은 무엇입니까?

여기까지 제가 지금까지 있습니다.

print "\x1b[31mWe need to declare a limit for x in the equation 90*(x*x) + 2*x." 
new_index = raw_input("type limit here>") 
test_1 = int(new_index) 

print "\x1b[31mWe need to declare a limit for n in the equation y+((91+(90*(x-1)))*n).\x1b[0m I suggest 3 (or up to 10). Any two points when plotted on a graph will describe a line of constant slope. To see only the first sequence of numbers put 0." 
print "Enter your limit value here.\x1b[0m" 
now_test = raw_input("type limit here>") 
new_test = int(now_test) 

def dr1_ld1_91_91(x): 
    y = 90*(x*x) + 2*x 
    print "(nonn)", "(nonn)", y 
    for n in xrange(1, new_test): 
     new_y = y+((91+(90*(x-1)))*n) 
     print new_y, new_y 
    while new_y < new_test: 
     return 

for x in xrange(1, test_1): 
    dr1_ld1_91_91(x)#=182 

범위 설정 방법을 이해하는 데 어려움이 있습니다. 그래서 나는 사용자가 test_1new_test이 시퀀스를 제한하는 데 사용되는 변수라는 것을 선언하게해야합니다. 그러나 나는 xn 값의 반복과 관련이 없지만 시퀀스의 절대 값에 대한 제한 인 '전역 제한'이 필요합니다.

그래서 나는 그들이 ynew_y에 대한 글로벌 제한의 문턱에 머물 필요로 test_1new_test가 큰 성장 그래서 한계를 설정하려고 시도하고있다.

그래서 내 전류 출력은 다음과 같다 :

(nonn) (nonn) 92 
183 183 
274 274 
365 365 
456 456 
(nonn) (nonn) 364 
545 545 
726 726 
907 907 
1088 1088 
(nonn) (nonn) 816 
1087 1087 
1358 1358 
1629 1629 
1900 1900 
(nonn) (nonn) 1448 
1809 1809 
2170 2170 
2531 2531 
2892 2892 

nonn 첫번째 식을 나타내고, 그 아래의 서열은 두번째 식을 나타낸다.

전역 제한 (예 : 10,000)으로 채우기에 충분한 용어를 인쇄하려면이 두 시퀀스가 ​​모두 필요합니다. 필자는 사용자가 제출 한 값에서 전역 한계로 변환하는 프로그래머로서 충분히 발전하지 못했습니다.

나는 enter code here을 볼 수 없습니다. 나는이 문제를 이해하도록

+0

당신이 성취하고자하는 것은 실제로 명확하지 않습니다. _Why_ 범위 내에서 모든 범위를 수행하고 있습니까? 이 일을 통해 실제로 무엇을 해결하려고하십니까? –

+0

이 함수에 의해 생성 된 모든 용어는 복합입니다. 그래서 전 세계적인 한도 아래 모든 조건을 요약하여 매우 좁은 유형의 체를 생산하려고합니다. 인쇄 된 숫자에 90을 곱한 다음 1을 더하여 기본 10 형식으로 합성 숫자를 복구 할 수 있습니다. –

답변

1

만들기 :

x is an integer in [1 .. max_x] 

y = 90 * x**2 + 2 * x 

z = y + ((91 + (90 * (x - 1))) * n) 
    = 90*x*n + n + y 
    = (90*x + 1)*n + (90*x**2 + 2*x) 
    = 90 * x**2 + (90 * n + 2) * x + n 

n is an integer > 0 

하고 max_n 같은 z(x, max_n) <= limit_value < z(x, max_n+1) 있음을 발견 할 각 x에 대한

?

let k be a real number in [0..1) and max_n' == max_n + k 

max_z = (90*x + 1)*max_n' + (90*x**2 + 2*x) 

max_n' = (max_z - (90*x**2 + 2*x))/(90*x + 1) 

max_n = floor(max_n') = floor((max_z - (90*x**2 + 2*x))/(90*x + 1)) 

(다음 코드는 파이썬 2.7을 가정) :

n > 0x > 0 경우, z(n,x) 긍정적 인 포물선 (위쪽으로 열림)과 x 주어 max_z는 간단합니다에 대한 정수 max_n을 찾는 것입니다

import math 

FMT = "{:>8} {:>8} {:>8}".format 

def get_int(prompt, lo=None, hi=None): 
    while True: 
     try: 
      value = int(raw_input(prompt)) 
      if (lo is None or lo <= value) and (hi is None or value <= hi): 
       return value 
     except ValueError: # could not parse input as int 
      pass    # try again 

def max_x(max_y): 
    # y = 90*x**2 + 2*x 
    # 0 = 90*x**2 + 2*x - y 
    # Using the quadratic formula, 
    # x = (-2 +/- sqrt(4 + 360*y))/180 
    # We are only interested in the +ve solution: 
    discr_rt = math.sqrt(4 + 360 * max_y) 
    x = (discr_rt - 2.)/180. 
    # and we want to round down to an int 
    return int(math.floor(x)) 

def max_n(x, max_z): 
    a = 90*x + 1 
    y = (90*x + 2)*x 
    nf = float(max_z - y)/a 
    return int(math.floor(nf)) 

def z(x, n): 
    a = 90*x + 1 
    y = (90*x + 2)*x 
    return a*n + y 

def main(): 
    max_z = get_int("Please enter int value for max_z: ", 1, 10000) 
    max_y = max_z 
    max_x_val = max_x(max_y) 

    for x in xrange(1, max_x_val + 1): 
     max_n_val = max_n(x, max_z) 
     if max_n_val < 1: 
      break 
     y = (90*x + 2)*x 
     print(FMT("(nonn)", "(nonn)", y)) 
     for n in xrange(1, max_n_val + 1): 
      z_val = z(x, n) 
      print(FMT(z_val, z_val, "")) 

if __name__=="__main__": 
    main() 

그러면 다음과 같은 결과가 출력됩니다.

Please enter int value for max_z: 2000 
    (nonn) (nonn)  92 
    183  183   
    274  274   
    365  365   
    456  456   
    547  547   
    638  638   
    729  729   
    820  820   
    911  911   
    1002  1002   
    1093  1093   
    1184  1184   
    1275  1275   
    1366  1366   
    1457  1457   
    1548  1548   
    1639  1639   
    1730  1730   
    1821  1821   
    1912  1912   
    (nonn) (nonn)  364 
    545  545   
    726  726   
    907  907   
    1088  1088   
    1269  1269   
    1450  1450   
    1631  1631   
    1812  1812   
    1993  1993   
    (nonn) (nonn)  816 
    1087  1087   
    1358  1358   
    1629  1629   
    1900  1900   
    (nonn) (nonn)  1448 
    1809  1809   

편집마다이 업데이트되었습니다!

+0

매우 가까워졌습니다. max_x 값은 시퀀스 92, 364, 816을 생성합니다 ..... max_z에 설정 한 제한과 동일한 절대 값이되도록 시퀀스의 제한이 필요합니다.그래서 max_z의 동작은 * 정확하게 맞습니다 * 그러나 max_x의 동작은 아닙니다. y가 max_z와 같은 한도로 인쇄되도록 max_x를 평가할 수 있습니까? BTW, 응답 해 주셔서 감사합니다! –

+0

당신은 정말로 그것을 못 박았다! –

+0

이것이 적절한 방법인지는 모르겠지만 나를 위해 약간의 코딩을하는 데 당신을 고용하는 데 관심이 있습니다. 당신이 코딩 한 것은 더 큰 프로젝트의 조각을 나타냅니다. 그러나 나는 당신이 원래의 이슈를 얼마나 빨리 평가했는지를 생각해 볼 때 아주 짧은 시간에 그것을 완료 할 수있을 것이라고 생각합니다 .... 나는 어느 때보 다 다른 사람에게 연락하는 방법을 모른다. 코멘트를 .... 이것은이 포럼에서 의사 소통의 "합법적 인"방법인가요? –

관련 문제