Home > Software engineering >  split the number given by user so RHS= LHS
split the number given by user so RHS= LHS

Time:09-27

split the number where RHS multiplication is equal to LHS input by the user.

if there is no split available return -1 if multiple return least split

input

142811

output

1*4*2 =8*1*1
>>>3

input

301501

output

3*0=1*5*0*1 
>>>2

i could just convert the number to the list

a=int(input("enter a number="))
res = [int(x) for x in str(a)]

and after that i could not know possible algorithm for it

CodePudding user response:

Try this:

# Your code to get the number in a list
a=int(input("enter a number="))
res = [int(x) for x in str(a)]

# Define function to get the product of a list of numbers
def product(nums):
    ret = 1
    for n in nums:
        ret *= n
    return ret

# Iterate through numbers
for i in range(len(res)):
    # Check if the products match
    if product(res[:i]) == product(res[i:]):
        # If they do, output and break
        print('*'.join(str(x) for x in res[:i]), '=', '*'.join(str(y) for y in res[i:]))
        break
else:
    # If no break occurred, output 'Not found.'
    print('Not found.')

Output:

enter a number=142811
1*4*2 = 8*1*1

CodePudding user response:

try this;

def code(a):
    cnt = 1
    for i in range(1,len(a)):
        list_lhs = a[:i]
        list_rhs = a[i:]
        
        left,right = 1,1
        
        for n in list_lhs:
            left = left*int(n)
        for n in list_rhs:
            right = right*int(n)
        if left == right:
            cnt = 0
            print("Found Split at",i,":",list_lhs, "and", list_rhs)
            break
    if cnt == 1:
        print("-1")
code(a = "301501")

# Found Split at 2 : 30 and 1501

CodePudding user response:

from math import prod


def base10list(n: int) -> list[int]:
    return [int(s) for s in str(n)]


def split_mul(n: int) -> int:
    numbers = base10list(n)
    for i in range(len(numbers)):
        if prod(numbers[:i]) == prod(numbers[i:]):
            return i
    return -1


def main() -> None:
    a = int(input("Enter an integer: "))
    print("Split index:", split_mul(a))


if __name__ == '__main__':
    main()

Result:

enter an integer: 142811
Split index: 3

CodePudding user response:

Try this code -

#multiply elements of list
def mul(nl):
  product = 1
  for n in nl:
    product = product*n
  return product


def calculate_split_point(numList):
  for i in range(1, len(numList)):
    if mul(numList[:i]) == mul(numList[i:]):
      numList = [str(n) for n in numList]
      print(f'{"*".join(numList[:i])} = {"*".join(numList[i:])}')
      return i
  
  return -1


num = input("Enter a number :: ")
numList = [int(n) for n in num]   # List of numbers

calculate_split_point(numList)

CodePudding user response:

Very interesting and unique problem, loved solving it!

def multiply(num):
   total = 1
   for n in num: total*=int(n)
   return total
def equ(num, split):
    t1 = multiply(num[:split])
    t2 = multiply(num[-(len(num)-split):])
    ret_value = split if split <= len(num)-split else len(num) - split
    if t2 == t1: return ret_value
    else: return False

inp = input("Enter a number:")
p_splits = len(inp) - 1
splits = []
for i in range(p_splits):
    val = equ(inp, i 1)
    if not val == False:
        splits.append(val)
splits.sort()
try: print(splits[0])
except IndexError: print("-1")

CodePudding user response:

If you like try this:

def get_split(usr_input_str):
    lst_digits = [digit for digit in usr_input_str]
    for i in range(1,len(lst_digits)):
        str_expr = '*'.join(lst_digits[0:i]) '==' '*'.join(lst_digits[i:])
        if eval(str_expr):
            print(str_expr)
            return 
    print(-1)
get_split("142811")

Here how it works:

  • for i in range(1,len(lst_digits)-1): start with a split position after the first digit (therefore the 1, in range) and check all positions until the last digit (therefore ,len(lst_digits))
  • build a string inserting "==" at the split position i and "*" in all other positions (done by str_expr =)
  • check if the string (fo example "1*4*2==8*1*1" evaluates to True and print the string if it does
  • if the loop over all split positions did not print anything print(-1)
  • Related