Find all possible outcomes of a given expression
Last Updated :
10 Jun, 2021
Given an arithmetic expression, find all possible outcomes of this expression. Different outcomes are evaluated by putting brackets at different places.
We may assume that the numbers are single digit numbers in given expression.
Examples:
Input: 1+3*2
Output: 8 7
Explanation
(1 + 3)*2 = 80
(1 + (3 * 2)) = 70
Input: 1*2+3*4
Output: 14 20 14 20 20
(1*(2+(3*4))) = 14
(1*((2+3)*4)) = 20
((1*2)+(3*4)) = 14
((1*(2+3))*4) = 20
((1*2)+3)*4) = 20
The idea is to iterate through every operator in given expression. For every operator, evaluate all possible values of its left and right sides. Apply current operator on every pair of left side and right side values and add all evaluated values to the result.
1) Initialize result 'res' as empty.
2) Do following for every operator 'x'.
a) Recursively evaluate all possible values on left of 'x'.
Let the list of values be 'l'.
a) Recursively evaluate all possible values on right of 'x'.
Let the list of values be 'r'.
c) Loop through all values in list 'l'
loop through all values in list 'r'
Apply current operator 'x' on current items of
'l' and 'r' and add the evaluated value to 'res'
3) Return 'res'.
Below is the implementation of above algorithm.
C++
#include<bits/stdc++.h>
using namespace std;
int eval( int a, char op, int b)
{
if (op== '+' ) return a+b;
if (op== '-' ) return a-b;
if (op == '*' ) return a*b;
}
vector< int > evaluateAll(string expr, int low, int high)
{
vector< int > res;
if (low == high)
{
res.push_back(expr[low] - '0' );
return res;
}
if (low == (high-2))
{
int num = eval(expr[low]- '0' , expr[low+1],
expr[low+2]- '0' );
res.push_back(num);
return res;
}
for ( int i=low+1; i<=high; i+=2)
{
vector< int > l = evaluateAll(expr, low, i-1);
vector< int > r = evaluateAll(expr, i+1, high);
for ( int s1=0; s1<l.size(); s1++)
{
for ( int s2=0; s2<r.size(); s2++)
{
int val = eval(l[s1], expr[i], r[s2]);
res.push_back(val);
}
}
}
return res;
}
int main()
{
string expr = "1*2+3*4" ;
int len = expr.length();
vector< int > ans = evaluateAll(expr, 0, len-1);
for ( int i=0; i< ans.size(); i++)
cout << ans[i] << endl;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int eval( int a, char op, int b)
{
if (op == '+' )
{
return a + b;
}
if (op == '-' )
{
return a - b;
}
if (op == '*' )
{
return a * b;
}
return Integer.MAX_VALUE;
}
static Vector<Integer> evaluateAll(String expr,
int low, int high)
{
Vector<Integer> res = new Vector<Integer>();
if (low == high)
{
res.add(expr.charAt(low) - '0' );
return res;
}
if (low == (high - 2 ))
{
int num = eval(expr.charAt(low) - '0' ,
expr.charAt(low + 1 ),
expr.charAt(low + 2 ) - '0' );
res.add(num);
return res;
}
for ( int i = low + 1 ; i <= high; i += 2 )
{
Vector<Integer> l = evaluateAll(expr, low, i - 1 );
Vector<Integer> r = evaluateAll(expr, i + 1 , high);
for ( int s1 = 0 ; s1 < l.size(); s1++)
{
for ( int s2 = 0 ; s2 < r.size(); s2++)
{
int val = eval(l.get(s1), expr.charAt(i), r.get(s2));
res.add(val);
}
}
}
return res;
}
public static void main(String[] args)
{
String expr = "1*2+3*4" ;
int len = expr.length();
Vector<Integer> ans = evaluateAll(expr, 0 , len - 1 );
for ( int i = 0 ; i < ans.size(); i++)
{
System.out.println(ans.get(i));
}
}
}
|
Python3
def eval (a, op, b):
if op = = '+' : return a + b
if op = = '-' : return a - b
if op = = '*' : return a * b
def evaluateAll(expr, low, high):
res = []
if low = = high:
res.append( int (expr[low]))
return res
if low = = (high - 2 ):
num = eval ( int (expr[low]),
expr[low + 1 ],
int (expr[low + 2 ]))
res.append(num)
return res
for i in range (low + 1 , high + 1 , 2 ):
l = evaluateAll(expr, low, i - 1 )
r = evaluateAll(expr, i + 1 , high)
for s1 in range ( 0 , len (l)):
for s2 in range ( 0 , len (r)):
val = eval (l[s1], expr[i], r[s2])
res.append(val)
return res
if __name__ = = "__main__" :
expr = "1*2+3*4"
length = len (expr)
ans = evaluateAll(expr, 0 , length - 1 )
for i in range ( 0 , len (ans)):
print (ans[i])
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int eval( int a, char op, int b)
{
if (op == '+' )
{
return a + b;
}
if (op == '-' )
{
return a - b;
}
if (op == '*' )
{
return a * b;
}
return int .MaxValue;
}
static List< int > evaluateAll(String expr,
int low, int high)
{
List< int > res = new List< int > ();
if (low == high)
{
res.Add(expr[low] - '0' );
return res;
}
if (low == (high - 2))
{
int num = eval(expr[low] - '0' ,
expr[low + 1],
expr[low + 2] - '0' );
res.Add(num);
return res;
}
for ( int i = low + 1; i <= high; i += 2)
{
List< int > l = evaluateAll(expr, low, i - 1);
List< int > r = evaluateAll(expr, i + 1, high);
for ( int s1 = 0; s1 < l.Count; s1++)
{
for ( int s2 = 0; s2 < r.Count; s2++)
{
int val = eval(l[s1], expr[i], r[s2]);
res.Add(val);
}
}
}
return res;
}
public static void Main()
{
String expr = "1*2+3*4" ;
int len = expr.Length;
List< int > ans = evaluateAll(expr, 0, len - 1);
for ( int i = 0; i < ans.Count; i++)
{
Console.WriteLine(ans[i]);
}
}
}
|
PHP
<?php
function eval1( $a , $op , $b )
{
if ( $op == '+' ) return $a + $b ;
if ( $op == '-' ) return $a - $b ;
if ( $op == '*' ) return $a * $b ;
}
function eval1uateAll( $expr , $low , $high )
{
$res = array ();
if ( $low == $high )
{
array_push ( $res , ord( $expr [ $low ]) -
ord( '0' ));
return $res ;
}
if ( $low == ( $high - 2))
{
$num = eval1(ord( $expr [ $low ]) -
ord( '0' ), $expr [ $low + 1],
ord( $expr [ $low + 2]) -
ord( '0' ));
array_push ( $res , $num );
return $res ;
}
for ( $i = $low + 1; $i <= $high ; $i += 2)
{
$l = eval1uateAll( $expr , $low , $i - 1);
$r = eval1uateAll( $expr , $i + 1, $high );
for ( $s1 = 0; $s1 < count ( $l ); $s1 ++)
{
for ( $s2 = 0; $s2 < count ( $r ); $s2 ++)
{
$val = eval1( $l [ $s1 ],
$expr [ $i ], $r [ $s2 ]);
array_push ( $res , $val );
}
}
}
return $res ;
}
$expr = "1*2+3*4" ;
$len = strlen ( $expr );
$ans = eval1uateAll( $expr , 0, $len - 1);
for ( $i = 0; $i < count ( $ans ); $i ++)
echo $ans [ $i ] . "\n" ;
?>
|
Javascript
<script>
function eval(a,op,b)
{
if (op == '+' )
{
return a + b;
}
if (op == '-' )
{
return a - b;
}
if (op == '*' )
{
return a * b;
}
return Number.MAX_VALUE;
}
function evaluateAll(expr,low,high)
{
let res = [];
if (low == high)
{
res.push(expr[low] - '0' );
return res;
}
if (low == (high - 2))
{
let num = eval(expr[low] - '0' ,
expr[low + 1],
expr[low + 2] - '0' );
res.push(num);
return res;
}
for (let i = low + 1; i <= high; i += 2)
{
let l = evaluateAll(expr, low, i - 1);
let r = evaluateAll(expr, i + 1, high);
for (let s1 = 0; s1 < l.length; s1++)
{
for (let s2 = 0; s2 < r.length; s2++)
{
let val = eval(l[s1], expr[i], r[s2]);
res.push(val);
}
}
}
return res;
}
let expr = "1*2+3*4" ;
let len = expr.length;
let ans = evaluateAll(expr, 0, len - 1);
for (let i = 0; i < ans.length; i++)
{
document.write(ans[i]+ "<br>" );
}
</script>
|
Output:
14
20
14
20
20
Exercise: Extend the above solution so that it works for numbers with multiple digits also. For example, expressions like “100*30+20” (Hint: We can create an integer array to store all operands and operators of given expression).
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...