All possible way of adding up number in a sequence so that it becomes a given number

Question:

I was given range n and number k. Count the possible ways so that two (not identical) number in that range add up to number k. And can this be done without nested loops?
Here’s my approach, the only thing is I’m using a nested loop, which takes times and not computer-friendly. Opposite pairs like (A, B) and (B, A) still count as 1.

n, k = int(input()), int(input())
cnt = 0
for i in range(1, n+1):
    for s in range(1, n+1):
        if i == 1 and s == 1 or i == n+1 and s==n+1:
            pass
        else:
            if i+s==k:
                cnt += 1
print(int(cnt/2))

example inputs (first line is n, second is k)

8
5

explanation(1, 4 and 2, 3), so I should be printing 2

Asked By: Codeer

||

Answers:

If I understood you well it’s gonna be just a single while loop counting up to k:

counter = 0
while counter<min(n,k)/2:
    if counter+(k-counter) == k: # This is always true actually...
        print(counter,k-counter)
    counter+=1
  • Starting from 0 up to k those pairs are gonna be counter and k – counter (complement to k, so result of subtracting the counter from k)
  • We should can count up to smaller of the two n and k, cause numbers bigger than k are not gonna add up to k
  • Actually we should count up to a half of that, cause we’re gonna get symmetric results after that.

So considering you don’t want to print each pair it’s actually:

count = int(min(n,k)//2)
Answered By: Gameplay

A problem of combinatorics. The following code uses python’s built-in library to generate all possible combinations

from itertools import combinations

n = 10
k = 5

n_range = [i for i in range(1, n+1)]

result = []

for i in n_range:
    n_comb = combinations(n_range, i)
    for comb in n_comb:
        if sum(comb) == k:
            result.append(comb)

print(result)
Answered By: foobar

You only need a single loop for this:

n = int(input('N: ')) # range 1 to n
k = int(input('K: '))
r = set(range(1, n+1))
c = 0

while r:
    if k - r.pop() in r:
        c += 1

print(c)
Answered By: Pingu

why are you iterating and checking number combinations when you can mathematically derive the count of valid pairs using n and k itself?

depending on whether n or k being larger the number of pairs can be calculated directly

Every number i within n range has a matching pair k-i
and depending on whether n or k which greater we need to validate whether k-i and i both are within the range n and not equal.

for n>=k case the valid range is from 1 to k-1
and for the other case the valid range is from k-n to n
and the count of a range a to b is b-a+1

since in both conditions the pairs are symmetrical these range count should be halved.

so the entire code becomes

n= int(input())
k=int(input()) 
if n>=k:print(int((k-1)/2)) 
if n<k:print(int((2*n-(k-1))/2))
Answered By: Vishnu Balaji
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.