您的位置:首页 > 移动开发 > Objective-C

用了一种以前没用过的方法来实现计算24点

2006-12-18 18:46 477 查看
代码没有优化


 


 class Number




    ...{


        int numerator;


        int denominator;


        private string tag;


        public string Tag




        ...{




            get ...{ return tag; }




            set ...{ tag = value; }


        }




        public int Numerator




        ...{




            get ...{ return numerator; }


        }


        public int Denominator




        ...{




            get ...{ return denominator; }


        }


        public Number(int n)




        ...{


            denominator = 1;


            numerator = n;


            //tag = n.ToString();


        }


        public Number(Number n)




        ...{


            denominator = n.denominator;


            numerator = n.numerator;


            tag = n.tag;


        }


        public static Number operator +(Number n1, Number n2)




        ...{


            if (n1 == null || n2 == null) return null;//分母为0


            Number n = new Number(n1);


            n.numerator = n.numerator * n2.denominator + n2.numerator * n.denominator;


            n.denominator *= n2.denominator;


            return n;


        }


        public static Number operator -(Number n1, Number n2)




        ...{


            if (n1 == null || n2 == null) return null;


            Number n = new Number(n1);


            n.numerator = n.numerator * n2.denominator - n2.numerator * n.denominator;


            n.denominator *= n2.denominator;


            return n;


        }


        public static Number operator *(Number n1, Number n2)




        ...{


            if (n1 == null || n2 == null) return null;


            Number n = new Number(n1);


            n.denominator *= n2.denominator;


            n.numerator = n.numerator * n2.numerator;


            return n;


        }


        public static Number operator /(Number n1, Number n2)




        ...{


            if (n1 == null || n2 == null || n2.numerator == 0) return null;//分母为0


            Number n = new Number(n1);


            n.denominator *= n2.numerator;


            n.numerator = n.numerator * n2.denominator;


            return n;


        }


        public override string ToString()




        ...{


            return numerator.ToString() + "/" + denominator.ToString();


        }


    }




    //排列组合的类


    public class Combination : IEnumerator




    ...{


        int num;


        object[] allobjects;


        int[] rtnindex;


        //int sortIndex;


        private string tag;


        public string Tag




        ...{




            get ...{ return tag; }




            set ...{ tag = value; }


        }




        public Combination(int n, params object[] objs)




        ...{


            num = n;


            allobjects = objs;


        }




        public int Count




        ...{


            get




            ...{


                return allobjects.Length;


            }


        }




      IEnumerator Member#region IEnumerator Member




        public object Current




        ...{


            get 




            ...{ 


                object[] os = new object[num];


                for(int i = 0; i < num; os[i] = allobjects[rtnindex[i]], i++);


                return os; 


            }


        }


        public object Remains




        ...{


            get 




            ...{


                int[] a = new int[allobjects.Length];


                for (int i = 0; i < allobjects.Length; a[i] = i, i++) ;


                for(int i = 0; i < num; a[rtnindex[i]] = -1, i++);




                object[] os = new object[allobjects.Length - num];


                int k = 0;


                for (int i = 0; i < allobjects.Length; i++)




                ...{


                    if (a[i] != -1)




                    ...{


                        os[k++] = allobjects[a[i]];


                    }


                }


                return os; 


            }


        }




        /**//**//**//**//**//**//**//*


        private static void Sort(int[] data, int startIndex, int endIndex)


        {


            for (int j = startIndex; j <= endIndex; j++)


            {


                for (int i = endIndex - 1; i >= j; i--)


                {


                    if (data[i] > data[i + 1])


                    {


                        data[i] ^= data[i + 1];


                        data[i + 1] ^= data[i];


                        data[i] ^= data[i + 1];


                    }


                }


            }


        }


        */


        private bool isEnd;


        public bool MoveNext()




        ...{


            if (num <= 0 || allobjects == null || allobjects.Length == 0 || num > allobjects.Length) return false;


            if (rtnindex == null)




            ...{


                rtnindex = new int[num];


                for (int i = 0; i < num; rtnindex[i] = i, i++) ;


                isEnd = false;


                return true;


            }


            if (isEnd) return false;




            bool found = false;


            int max = allobjects.Length - 1;


            do




            ...{


                rtnindex[num - 1]++;


                if (rtnindex[num - 1] > max)




                ...{


                    int n = num - 1;


                    while (n - 1 >= 0 && rtnindex[n - 1] == max)




                    ...{


                        n--;


                    }


                    if (n - 1 < 0) return false;


                    rtnindex[n - 1]++;


                    found = false;


                    for (int k = 0; k <= n-2; k++)




                    ...{


                        if (rtnindex[k] == rtnindex[n-1])




                        ...{


                            found = true;


                            break;


                        }


                    }


                    if (found)




                    ...{


                        if (n  >= 0)




                        ...{


                            for (int i = n ; i < num; i++)




                            ...{


                                rtnindex[i] = max;


                            }


                        }


                        continue;


                    }




                    for (int i = n; i < num; i++)




                    ...{


                        for (int j = 0; j <= max; j++)




                        ...{


                            rtnindex[i] = j;


                            found = false;


                            for (int k = 0; k < i; k++)




                            ...{


                                if (rtnindex[k] == rtnindex[i])




                                ...{


                                    found = true;


                                    break;


                                }


                            }


                            if (!found) break;


                        }


                    }


                    break;


                }//end rtnindex[num - 1] > max


                else




                ...{


                    found = false;


                    for (int k = 0; k < num -1; k++)




                    ...{


                        if (rtnindex[k] == rtnindex[num-1])




                        ...{


                            found = true;


                            break;


                        }


                    }


                    if (!found) break;


                }


            } while (true);




            isEnd = true;


            for (int i = 0; i < num; i++)




            ...{


                if (rtnindex[i] != max - i)




                ...{


                    isEnd = false;


                    break;


                }


            }




            return true;


        }




        public void Reset()




        ...{


            isEnd = false;


            rtnindex = null;


        }




        #endregion


    }




    class C24




    ...{


        public static void Compute(Combination c, int result, ArrayList list)




        ...{


            c.Reset();


            while (c.MoveNext())




            ...{


                Number[] ns = Convert(c.Current);


                Number[] ns1 = Convert(c.Remains);


                Combination f1 = new Combination(1, '+', '-', '*', '/');


                while (f1.MoveNext())




                ...{


                    char f = (char)((object[])f1.Current)[0];


                    Number n = Eval(ns[0], ns[1], f);


                    if (n == null) continue;


                    n.Tag = "(" + ns[0].Tag + f + ns[1].Tag + ")";


                    if (ns1.Length > 0)




                    ...{


                        Number[] nn = new Number[ns1.Length + 1];


                        nn[0] = n;


                        for(int i = 0; i < ns1.Length; i++)




                        ...{


                            nn[i + 1] = ns1[i];


                        }


                        Combination z2 = new Combination(2, nn);


                        Compute(z2, result, list);


                    }


                    else




                    ...{


                        if (n != null && (n.Numerator / n.Denominator == result && n.Numerator % n.Denominator == 0))




                        ...{


                            if (!list.Contains(n.Tag))


                                list.Add(n.Tag);


                        }


                    }


                }


            }


        }




        public static void ComputeN(ArrayList result, int N, params int[] nums) //计算N Ex.C24.ComputeN(list, 22, 1,2,3,4,5);




        ...{


            Number[] ns = new Number[nums.Length];


            for(int i = 0; i < nums.Length; i++)




            ...{


                ns[i] = new Number(nums[i]);


                ns[i].Tag = nums[i].ToString();


            }


            Compute(new Combination(2, ns), N, result);


        }




        public static void Compute24(int a, int b, int c, int d, ArrayList list)  //计算24




        ...{


            Number n1 = new Number(a); n1.Tag = a.ToString();


            Number n2 = new Number(b); n2.Tag = b.ToString();


            Number n3 = new Number(c); n3.Tag = c.ToString();


            Number n4 = new Number(d); n4.Tag = d.ToString();


            Combination z1 = new Combination(2, n1, n2, n3, n4);


            Compute(z1, 24, list);


        }




        private static Number Eval(Number n1, Number n2, char f)




        ...{


            switch (f)




            ...{


                case '+':


                    return n1 + n2;


                case '-':


                    return n1 - n2;


                case '*':


                    return n1 * n2;


                case '/':


                    return n1 / n2;


            }


            return null;


        }


        private static Number[] Convert(object nums)




        ...{


            object[] os = (object[])nums;


            Number[] ns = new Number[os.Length];


            os.CopyTo(ns, 0);


            return ns;


        }


    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  object null n2 string class os