python – Correct logic

Question:

Problem : I am given the number n as input, the fact is that this number can be obtained as follows: Let's take the initial value x , the next value x + 1 , the next x + 2 and so on.

x is a natural number, that is, the minimum value of x = 1

If we add x + (x + 1) + (x + 2) + ... x + m alternately, then it is guaranteed that someday we will get n , the main problem is that the number of such terms is unknown ((The task is in the fact that you need to find the minimum value of x at which this task will be completed (I repeat – it will be guaranteed that it will be executed)

For this, I could not deduce the math and wrote an overkill:

n = int(input())
nold = n
i = 0
iold = i
x = 1
xold = x
while True:
    n = n - (x + i)
    i += 1
    if n < 0:
        i = 0
        x = xold + 1
        xold = x
        n = nold
    elif n == 0:
        break
print(x)

But, as I expected, the program is too slow with large numbers, can you help? It would be nice if you could help me figure out the math

Answer:

n = 35  # 48, 50    

# ax + c = n
a = 1
x = 0
c = 0

a_i = 1
c_i = 0

while (n - c) / a >= 1:
    if ((n - c) / a).is_integer():
        a_i = a
        x = (n - c) // a
        c_i = c
    c += a
    a += 1

if c != 0:
    print(' + '.join([str(x)] + ['({0} + {1})'.format(x, coeff) for coeff in range(1, a_i)]), '=', n)
else:
    print(x, '=', n)

# 2 + (2 + 1) + (2 + 2) + (2 + 3) + (2 + 4) + (2 + 5) + (2 + 6) = 35
# 8 + (8 + 1) + (8 + 2) + (8 + 3) + (8 + 4) = 50
# 15 + (15 + 1) + (15 + 2) = 48

Another option :

import math


n = 3  # 34, 36, 1569

c = int(math.sqrt(n)) + 1
a = c + 1
c_n = sum(range(1, a))


if c_n == n:
    x = 1
else:
    x = n
    for c_i in range(c, 0, -1):
        if ((n - c_n) / (c_i + 1)) % 1 == 0:
            c = c_i + 1
            x = (n - c_n) // c
            break
        c_n -= c_i

if c != 0:
    print(' + '.join([str(x)] + ['({0} + {1})'.format(x, c_i) for c_i in range(1, c)]), '=', n)
else:
    print(x, '=', n)

# 1 + (1 + 1) = 3
# 7 + (7 + 1) + (7 + 2) + (7 + 3) = 34
# 1 + (1 + 1) + (1 + 2) + (1 + 3) + (1 + 4) + (1 + 5) + (1 + 6) + (1 + 7) = 36
# 259 + (259 + 1) + (259 + 2) + (259 + 3) + (259 + 4) + (259 + 5) = 1569
Scroll to Top