C# -算法:Google方程式

本文介绍了一种通过替换字母为数字来解决复杂方程式的算法。该算法能够处理包含加减乘除等于运算符的方程式,并找出所有可能的数字替换方案,使方程式成立。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

namespace Google方程式
{
    class Program
    {
        const int NUMBER_MIN = 0;
        const int NUMBER_MAX = 9;
        static List<CharNumber[]> result = new List<CharNumber[]>();
        static string strTrim;
        static void Main(string[] args)
        {
            string str = "WWWDOT - GOOGLE = DOTCOM";//777589 - 188103 = 589486;  777589 - 188106 = 589483
            strTrim = str.Replace(" ", "");

            List<CharItem> charItemList = InitCharItemList(strTrim);
            Number[] numList = InitNumberList();

            Console.WriteLine("获取数据中......");
            GetAllItems(numList, charItemList,charItemList.Count);
            Console.WriteLine("数据获取完毕\n数据检测中......");
            WriteTrueItem(strTrim);
            Console.WriteLine("数据检测完毕");
            Console.ReadLine();
        }
        /// <summary>
        /// 输出正确项
        /// </summary>
        /// <param name="strTrim">方程式(去除空格)</param>
        private static void WriteTrueItem(string strTrim)
        {           
            List<string> rlist = new List<string>();
            for(int i=0,len = result.Count;i<len;i++)
            {
                string str = strTrim;
                foreach (CharNumber item in result[i])
                {
                    str = str.Replace("" + item.ch, "" + item.num);
                }
                string[] strs = str.Split('=');
                int? sum1 = Calculate(strs[0]);
                int? sum2 = Calculate(strs[1]);
                if (sum2 == 589483)
                {

                }
                if (sum1 != null && sum2 != null && sum1 == sum2)
                {
                    rlist.Add(str);
                    Console.WriteLine(str);
                }
            }
        }
        /// <summary>
        /// 计算方程式
        /// </summary>
        /// <param name="str">方程式等号的其中一边</param>
        /// <returns></returns>
        private static int? Calculate(string str)
        {
            char[] strs = str.ToCharArray();
            int num = 0;int? sum = 0; char ch = '=';
            for (int i = 0, len = strs.Length; i < len; i++)
            {
                if (strs[i] >= '0' && strs[i] <= '9')
                {
                    num = num * 10 + Convert.ToInt32("" + strs[i]);
                    if (i==len-1)//当最后一个字符是数字时,应该执行运算
                    {
                        if (ch == '=')
                        {
                            sum += num;
                        }
                        else
                        {
                            sum = Calculate(ch, sum, num);
                            if (sum == null) return sum;
                        }
                    }             
                }
                else//方程式中不考虑除+ - * / =五个符号之外的任何符号,且=只允许一个
                {
                    if (ch != '=')//当之前已经出现了一个运算符号时,应该将前一步运算完成
                    {
                        sum = Calculate(ch, sum, num);
                        if (sum == null) return sum;
                        ch = '='; //恢复原状
                    }
                    else
                    {
                        ch = strs[i];
                        sum += num;
                    }
                     num = 0;
                }
            }
            return sum;
        }
        /// <summary>
        /// 计算
        /// </summary>
        /// <param name="ch">运算符号</param>
        /// <param name="sum">累计结果</param>
        /// <param name="num">数</param>
        /// <returns>累计结果和数的运算结果</returns>
        private static int? Calculate(char ch,int? sum,int num)
        {
            switch (ch)
            {
                case '+': sum = sum + num; break;
                case '-': sum = sum - num; break;
                case '*': sum = sum * num; break;
                case '/':
                    if (num == 0 || sum % num != 0)//排除除数为0,或不整除的情况
                        sum = null;
                    sum = sum / num;
                    break;
                default: sum = null; break;
            }
            return sum;
        }
        /// <summary>
        /// 获取所有可能项
        /// </summary>
        /// <param name="numList"></param>
        /// <param name="charItemList"></param>
        /// <param name="len"></param>
        /// <param name="index"></param>
        private static void GetAllItems(Number[] numList, List<CharItem> charItemList, int len, int index = 0)
        {
            if (index == len)
            {
                result.Add(CIListCopyToCNList(charItemList, len));
                return;
            }
            foreach (Number number in numList)
            {
                if (number.used) continue;
                if (number.num == 0 && charItemList[index].notZero) continue;
                charItemList[index].num = number.num;
                number.used = true;
                GetAllItems(numList, charItemList, len, index + 1);
                number.used = false;
            }
        }
        /// <summary>
        /// 复制数组信息
        /// </summary>
        /// <param name="charItemList"></param>
        /// <param name="len"></param>
        /// <returns></returns>
        private static CharNumber[] CIListCopyToCNList(List<CharItem> charItemList,int len)
        {
            CharNumber[] items = new CharNumber[len];
            int i=0;
            foreach (CharItem item in charItemList)
            {
                items[i++] = new CharNumber(item.ch, item.num);
            }
            return items;
        }
        /// <summary>
        /// 初始化字符数字数组信息
        /// </summary>
        /// <param name="strTrim">方程式字符串</param>
        /// <returns></returns>
        private static List<CharItem> InitCharItemList(string strTrim)
        {
            char[] symbols = new char[] { '+', '-', '*', '/', '=' };
            string[] strs = strTrim.Split(symbols);
            List<CharItem> list = new List<CharItem>();
            foreach (string str in strs)
            {
                var chars = str.ToCharArray();
                for (int i = 0, len = chars.Length; i < len; i++)
                {
                    int num = FindIndex(list, chars[i]);
                    if (i == 0 && len != 1)//首位字符,且字符数只有一个,则该字符可以为0
                    {
                        if (num == -1)
                        {
                            list.Add(new CharItem(chars[i], true));
                        }
                        else
                        {
                            list[num].notZero = true;
                        }
                    }
                    else
                    {
                        if (num == -1)
                        {
                            list.Add(new CharItem(chars[i]));
                        }
                    }
                }
            }
            return list;
        }
        /// <summary>
        /// 在数组中获取相同字符的元素的索引号,没有获取到则返回默认值-1
        /// </summary>
        /// <param name="list">数组</param>
        /// <param name="ch">所查找的字符</param>
        /// <returns></returns>
        private static int FindIndex(List<CharItem> list, char ch)
        {
            int result = -1;
            for (int i = 0, len = list.Count; i < len; i++)
            {
                if (list[i].ch == ch)
                {
                    result = i;
                    break;
                }
            }
            return result;
        }
        /// <summary>
        /// 初始化数字数组信息
        /// </summary>
        /// <returns></returns>
        private static Number[] InitNumberList()
        {
            int num = NUMBER_MAX - NUMBER_MIN + 1;
            Number[] list = new Number[num];
            for (int i = NUMBER_MIN; i <= NUMBER_MAX; i++)
            {
                list[i] = new Number(i);
            }
            return list;
        } 
        /// <summary>
        /// 类-字符数字(包含是否可以为0)
        /// </summary>
        class CharItem
        {
            public char ch;
            public bool notZero;
            public int num;

            public CharItem(char ch, bool notZero = false, int num = -1)
            {
                // TODO: Complete member initialization
                this.ch = ch;
                this.notZero = notZero;
                this.num = num;
            }
        }
        /// <summary>
        /// 类-字符数字(不包含是否可以为0)(可要可不要),不用就可以将所有的此类改为CharItem类
        /// </summary>
        class CharNumber
        {
            public char ch;
            public int num;
            public CharNumber(char ch, int num)
            {
                this.ch = ch;
                this.num = num;
            }
        }
        /// <summary>
        /// 类-数字
        /// </summary>
        class Number
        {
            public int num;
            public bool used;

            public Number(int num)
            {
                // TODO: Complete member initialization
                this.num = num;
                this.used = false;
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值