题目是网上看到的。
假设 a b c d e 代表1~9不同的5个数字,能满足形如: ab * cde = adb * ce 这样的算式一共有多少种?
我的算法是这样的(先不说我的算法是否高效,那个先不谈)
private static List<string> ss() 
        {
            List<string> s = new List<string> { };
            int a, b, c, d, e;
            //int [] arr = new int[1,2,3,4,5,6,7,8,9];
            List<int> strlist = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            List<int> strlist2, strlist3, strlist4, strlist5;
            ArrayList arr = new ArrayList();
            arr.AddRange(strlist.ToArray());
            foreach(int i in strlist)
            {
                a = i;
                strlist2 = strlist;
                strlist2.Remove(i);
                foreach (int i2 in strlist2)
                {
                    b = i2;
                    strlist3 = strlist2;
                    strlist2.Remove(i2);
                    foreach (int i3 in strlist3)
                    {
                        c = i3;
                        strlist4 = strlist3;
                        strlist4.Remove(i3);
                        foreach (int i4 in strlist4)
                        {
                            d = i4;
                            strlist5 = strlist4;
                            strlist5.Remove(i4);
                            foreach (int i5 in strlist5)
                            {
                                e = i5;
                                if((a*10+b)*(c*100+d*10+e) == (a*100+d*10+b)*(c*10+e))
                                {
                                    
                                    string str = ((a * 10 + b) * (c * 100 + d * 10 + e)).ToString() + "=" + ((a * 100 + d * 10 + b) * (c * 10 + e)).ToString();
                                    s.Add(str);
                                    
                                }                            }                        }
                    }                }
            }
            return s;
        }现在的情况是,代码第二次执行到foreach (int i4 in strlist4)的时候就会报集合已修改; 列舉作業可能尚未執行。
这样的错误。可是我明明都已经做了备份了呀?在remove之前都用新的数组做了备份的,应该和原先的数组没关系吧?

解决方案 »

  1.   

    List<int> strlist2, strlist3, strlist4, strlist5;
    这代码真懒的看,不知道的还以为是反编译出来的
      

  2.   

    呵呵  只是做一个小demo罢了  也不是真实的项目。
      

  3.   

    List<int> strlist2, strlist3, strlist4, strlist5; 
    这些都需要重新new一下的,
    strlist2 = strlist;  这样用的还是同一个地址,操作的还是同一个对象。
      

  4.   

    没用的 之前我就是每个都NEW出来之后在赋值的 可还是报错。后来改成了这样
      

  5.   

            private static List<string> ss() {
                List<string> s = new List<string> {
                };
                int a, b, c, d, e;
                //int [] arr = new int[1,2,3,4,5,6,7,8,9];
                List<int> strlist = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                //List<int> strlist2, strlist3, strlist4, strlist5;
                foreach (int i in strlist) {
                    a = i;
                    foreach (int i2 in strlist.Where(t => t != a)) {
                        b = i2;
                        foreach (int i3 in strlist.Where(t => t != a && t != b)) {
                            c = i3;
                            foreach (int i4 in strlist.Where(t => t != a && t != b && t != c)) {
                                d = i4;
                                foreach (int i5 in strlist.Where(t => t != a && t != b && t != d)) {
                                    e = i5;
                                    if ((a * 10 + b) * (c * 100 + d * 10 + e) == (a * 100 + d * 10 + b) * (c * 10 + e)) {
                                        string str = ((a * 10 + b) * (c * 100 + d * 10 + e)).ToString() + "=" + ((a * 100 + d * 10 + b) * (c * 10 + e)).ToString();
                                        s.Add(str);                                }
                                }                        }
                        }                }
                }
                return s;
            }
    这样子可以吗?
      

  6.   

    汗  你的太复杂了  改成for循环就好了,不知道怎么回事?你的是没出错,但是执行结果和我的不一样,你的是159个,我的是112个。
    贴下我的代码
    private static List<string> ss2()
            {
                List<string> s = new List<string> { };
                int a, b, c, d, e;
                //int [] arr = new int[1,2,3,4,5,6,7,8,9];
                List<int> strlist = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                //List<int> strlist2, strlist3, strlist4, strlist5;
                //ArrayList arr = new ArrayList();
                //arr.AddRange(strlist.ToArray());
                for (int i = 0; i < strlist.Count;i++ )
                {
                    a = strlist[i];
                    List<int> strlist2 = new List<int> { };
                    strlist2 = strlist;
                    strlist2.Remove(i);
                    for (int i2 = 0; i2 < strlist2.Count;i2++ )
                    {
                        b = strlist[i2];
                        List<int> strlist3 = new List<int> { };
                        strlist3 = strlist2;
                        strlist3.Remove(i2);
                        for (int i3 = 0; i3 < strlist3.Count;i3++ )
                        {
                            c = strlist[i3];
                            List<int> strlist4 = new List<int> { };
                            strlist4 = strlist3;
                            strlist4.Remove(i3);
                            for (int i4 = 0; i4 < strlist4.Count;i4++ )
                            {
                                d = strlist[i4];
                                List<int> strlist5 = new List<int> { };
                                strlist5 = strlist4;
                                strlist5.Remove(i4);
                                foreach (int i5 in strlist5)
                                {
                                    e = i5;
                                    if ((a * 10 + b) * (c * 100 + d * 10 + e) == (a * 100 + d * 10 + b) * (c * 10 + e))
                                    {                                    string str = ((a * 10 + b) * (c * 100 + d * 10 + e)).ToString() + "=" + ((a * 100 + d * 10 + b) * (c * 10 + e)).ToString();
                                        s.Add(str);                                }                            }                        }
                        }                }
                }
                return s;
            }
      

  7.   

    说到点子上了,从出错情况看,这个foreach必须是有问题啊,哈哈。
      

  8.   

    楼主,参考一下这个贴子 http://bbs.csdn.net/topics/60200885
      

  9.   

    说到点子上了,从出错情况看,这个foreach必须是有问题啊,哈哈。
    能问下 有什么问题吗?我想了半天也没想到啊
      

  10.   

    MSDN的一些描述:
    1、IEnumerable.GetEnumerator方法,返回一个循环访问集合的枚举数。
    2、有些语言提供一个隐藏直接使用枚举数的复杂性的语句。比如:C# foreach 语句使用枚举数。C#语言的foreach语句隐藏了枚举数的复杂性。因此,建议使用foreach,而不直接操作枚举数。
    3、.NET Framework 提供枚举数作为循环访问一个集合的简单方法。枚举数只读取集合中的数据,无法用于修改基础集合。foreach循环的行为过程分析:
    1、通过调用GetEnumerator方法获取对象的枚举数。
    2、从枚举数中请求每一项并且把它作为迭代变量,代码可以读但不可以改变。这样来说的话,用foreach循环某个集合A的时候,那在循环过程中就不能修改这个集合A。否则就会出现“集合已修改; 列舉作業可能尚未執行。”这样的错误。而用for循环则不会这样。我感觉你就是这个地方出了问题。
      

  11.   

    但是请看我的代码
    a = strlist[i];
                    List<int> strlist2 = new List<int> { };
                    strlist2 = strlist;
    我每次在remove之前把原来的数组赋给了一个新的数组,然后foreach循环的是新数组的元素,依次下去。也就是说在foreach循环中我根本没有改变过它的元素!
      

  12.   

    strlist2 = strlist;
    strlist2和strlist是同一个东西,改strlist2就是该strlist
    仔细看看引用类型和值类型的区别
      

  13.   

    strlist3 = strlist2;
    strlist2.Remove(i2);这弄错了吧 应该是strlist3 = strlist2;
    strlist3.Remove(i2);
      

  14.   

    楼主 看看  我的这个
    [code=cpp]
    #include <stdio.h>int main(void)
    {
        int a,b,c,d,e;  //定义5个数
    int m,n,m1,n1;
    int num=0;
    for( a=1;a<=9;a++)
    {
    for( b=1;b<=9;b++)
    {if(a != b)  //a跟b不相等 相等就不做
    for(c=1;c<=9;c++)
    {if(a!=c && b!=c)  //a,b,c不相等  相等就不做
    for(d=1;d<=9;d++)
    {if(a!=d && b!=d && c!=d)  //a,b,c,d不相等  相等就不做
        for(e=1;e<=9;e++)
    {
    if(a!=e && b!=e && c!=e && d!=e)  //a,b,c不相等   相等就不做
    {
    m=10*a+b;         //m=ab
    n=100*c+10*d+e;   //n=cde
    m1=100*a+10*d+b;  //m1=adb
    n1=10*c+e;        //n1=ce
    if(n*m==n1*m1)   //判断ab*cde 是否等于 adb*ce
    {num++;  //满足条件就加一
    //   printf(" %d * %d =%d *%d \n", n,m,n1,m1);   //打印出来看看是那些值
    }
    } }
    } }
    }
    }
    printf(" %d\n", num);   return 0;
    }
      

  15.   

    引用类型应该COPY复制而不是赋值