Click here to Skip to main content
15,887,822 members
Home / Discussions / C#
   

C#

 
QuestionRe: C# Computer calculate expression Pin
Richard MacCutchan10-Dec-16 20:49
mveRichard MacCutchan10-Dec-16 20:49 
AnswerRe: C# Computer calculate expression Pin
Pavlex410-Dec-16 22:40
Pavlex410-Dec-16 22:40 
GeneralRe: C# Computer calculate expression Pin
OriginalGriff10-Dec-16 22:45
mveOriginalGriff10-Dec-16 22:45 
GeneralRe: C# Computer calculate expression Pin
Richard MacCutchan10-Dec-16 21:51
mveRichard MacCutchan10-Dec-16 21:51 
GeneralRe: C# Computer calculate expression Pin
OriginalGriff10-Dec-16 22:42
mveOriginalGriff10-Dec-16 22:42 
GeneralRe: C# Computer calculate expression Pin
Jon McKee10-Dec-16 22:45
professionalJon McKee10-Dec-16 22:45 
AnswerRe: C# Computer calculate expression Pin
Patrice T10-Dec-16 22:42
mvePatrice T10-Dec-16 22:42 
GeneralRe: C# Computer calculate expression Pin
Pavlex411-Dec-16 6:22
Pavlex411-Dec-16 6:22 
Here is the code,but how to not use all values to make expression and how to if computer cannot find target number to make expression for closest to target value?

C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Expression_Evaluator
{
    class Program
    {
   	static int[] ReadInput(out int value)
        {
            Console.Write("Enter integer numbers to use (space-separated): ");
            string s = Console.ReadLine();
            string[] parts = s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            int[] a = new int[parts.Length];
            for (int i = 0; i < a.Length; i++)
                a[i] = int.Parse(parts[i]);

            Console.Write("Enter integer value to calculate: ");
            value = int.Parse(Console.ReadLine());

            return a;

        }
        static void SolveAndPrint(int[] numbers, int targetValue)
        {

            int targetKey = (targetValue << numbers.Length) + (1 << numbers.Length) - 1;

            HashSet<int> solvedKeys = new HashSet<int>();
            Dictionary<int, int> keyToLeftParent = new Dictionary<int, int>();
            Dictionary<int, int> keyToRightParent = new Dictionary<int, int>();
            Dictionary<int, char> keyToOperator = new Dictionary<int, char>();
            Queue<int> queue = new Queue<int>();

            for (int i = 0; i < numbers.Length; i++)
            {
                
                int key = (numbers[i] << numbers.Length) + (1 << i);

                solvedKeys.Add(key);
                queue.Enqueue(key);

            }

            while (queue.Count > 0 && !solvedKeys.Contains(targetKey))
            {

                int curKey = queue.Dequeue();

                int curMask = curKey & ((1 << numbers.Length) - 1);
                int curValue = curKey >> numbers.Length;

                int[] keys = new int[solvedKeys.Count];
                solvedKeys.CopyTo(keys);

                for (int i = 0; i < keys.Length; i++)
                {
                    
                    int mask = keys[i] & ((1 << numbers.Length) - 1);
                    int value = keys[i] >> numbers.Length;

                    if ((mask & curMask) == 0)
                    {
                        for (int op = 0; op < 6; op++)
                        {

                            char opSign = '\0';
                            int newValue = 0;

                            switch (op)
                            {
                                case 0: // Addition
                                    newValue = curValue + value;
                                    opSign = '+';
                                    break;
                                case 1: // Subtraction - another value subtracted from current
                                    newValue = curValue - value;
                                    opSign = '-';
                                    break;
                                case 2: // Subtraction - current value subtracted from another
                                    newValue = value - curValue;
                                    opSign = '-';
                                    break;
                                case 3: // Multiplication
                                    newValue = curValue * value;
                                    opSign = '*';
                                    break;
                                case 4: // Division - current divided by another
                                    newValue = -1;  // Indicates failure to divide
                                    if (value != 0 && curValue % value == 0)
                                        newValue = curValue / value;
                                    opSign = ' ';
                                    break;
                                case 5: // Division - other value divided by current
                                    newValue = -1;  // Indicates failure to divide
                                    if (curValue != 0 && value % curValue == 0)
                                        newValue = value / curValue;
                                    opSign = ' ';
                                    break;
                            }

                            if (newValue >= 0)
                            {   
                                int newMask = (curMask | mask);
                                
                                int newKey = (newValue << numbers.Length) + newMask;

                                if (!solvedKeys.Contains(newKey))
                                {    
                                    solvedKeys.Add(newKey);
                                    
                                    if (op == 2 || op == 5)
                                    {   
                                        keyToLeftParent.Add(newKey, keys[i]);
                                        keyToRightParent.Add(newKey, curKey);
                                    }
                                    else
                                    {
                                        keyToLeftParent.Add(newKey, curKey);
                                        keyToRightParent.Add(newKey, keys[i]);
                                    }

                                    keyToOperator.Add(newKey, opSign);
                                    solvedKeys.Add(newKey);
                                    queue.Enqueue(newKey);
                                    
                                }

                            }

                        }
                    }
                }

            }

            if (!solvedKeys.Contains(targetKey))
                Console.WriteLine("Solution has not been found.");
            else
            {
                PrintExpression(keyToLeftParent, keyToRightParent, keyToOperator, targetKey, numbers.Length);
                Console.WriteLine("={0}", targetValue);
            }
        }

        static void PrintExpression(Dictionary<int, int> keyToLeftParent, Dictionary<int, int> keyToRightParent, Dictionary<int, char> keyToOperator,
                                    int key, int numbersCount)
        {
            if (!keyToOperator.ContainsKey(key))
                Console.Write("{0}", key >> numbersCount);
            else
            {
                Console.Write("(");

                PrintExpression(keyToLeftParent, keyToRightParent, keyToOperator,
                                keyToLeftParent[key], numbersCount);

                Console.Write(keyToOperator[key]);

                PrintExpression(keyToLeftParent, keyToRightParent, keyToOperator,
                                keyToRightParent[key], numbersCount);
                Console.Write(")");
            }
        }
       static void Main(string[] args)
        {
            while (true)
            {

                int value;
                int[] numbers = ReadInput(out value);

                SolveAndPrint(numbers, value);

                Console.Write("More? (y/n) ");
                if (Console.ReadLine().ToLower() != "y")
                    break;

            }
        }
    }
}


modified 11-Dec-16 12:34pm.

GeneralRe: C# Computer calculate expression Pin
Patrice T11-Dec-16 8:29
mvePatrice T11-Dec-16 8:29 
QuestionC# SQL Server problem Pin
Pavlex410-Dec-16 5:32
Pavlex410-Dec-16 5:32 
AnswerRe: C# SQL Server problem Pin
OriginalGriff10-Dec-16 5:39
mveOriginalGriff10-Dec-16 5:39 
GeneralRe: C# SQL Server problem Pin
Pavlex410-Dec-16 5:55
Pavlex410-Dec-16 5:55 
GeneralRe: C# SQL Server problem Pin
OriginalGriff10-Dec-16 5:59
mveOriginalGriff10-Dec-16 5:59 
GeneralRe: C# SQL Server problem Pin
Pavlex410-Dec-16 6:04
Pavlex410-Dec-16 6:04 
GeneralRe: C# SQL Server problem Pin
OriginalGriff10-Dec-16 6:23
mveOriginalGriff10-Dec-16 6:23 
GeneralRe: C# SQL Server problem Pin
Pavlex410-Dec-16 6:49
Pavlex410-Dec-16 6:49 
GeneralRe: C# SQL Server problem Pin
OriginalGriff10-Dec-16 7:28
mveOriginalGriff10-Dec-16 7:28 
QuestionC# Check if textbox value exists in SQL server database Pin
Pavlex410-Dec-16 2:31
Pavlex410-Dec-16 2:31 
AnswerRe: C# Check if textbox value exists in SQL server database Pin
Wendelius10-Dec-16 2:40
mentorWendelius10-Dec-16 2:40 
GeneralRe: C# Check if textbox value exists in SQL server database Pin
Pavlex410-Dec-16 4:16
Pavlex410-Dec-16 4:16 
GeneralRe: C# Check if textbox value exists in SQL server database Pin
PIEBALDconsult10-Dec-16 4:22
mvePIEBALDconsult10-Dec-16 4:22 
AnswerRe: C# Check if textbox value exists in SQL server database Pin
Wendelius10-Dec-16 5:18
mentorWendelius10-Dec-16 5:18 
QuestionC# Textbox Pin
Pavlex49-Dec-16 6:57
Pavlex49-Dec-16 6:57 
AnswerRe: C# Textbox Pin
Michael_Davies9-Dec-16 7:03
Michael_Davies9-Dec-16 7:03 
GeneralRe: C# Textbox Pin
Pavlex49-Dec-16 7:06
Pavlex49-Dec-16 7:06 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.