题目是网上看到的。
假设 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之前都用新的数组做了备份的,应该和原先的数组没关系吧?
假设 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之前都用新的数组做了备份的,应该和原先的数组没关系吧?
解决方案 »
- 静态方法中实例化对象并返回是否是安全的?
- 怎么更新覆盖正在运行的文件?
- 上传图书老不上传不上,怎么回事啊?高手们帮帮忙吧....
- 关于打开写字板(*RTF)文件 ! 谢谢
- 关于Microsoft.XMLHTTP 与MSXML2.XMLHTTP的一个问题
- 求简单正则表达式!
- help me!!~~~~~~~~
- 请教在RichTextBox中加了图片内容后,如何将RichTextBox中的图片和文字一起保存到数据库中?
- 我表中一个字段为sign,我想让sign=1时在DataGrid中显示为“已执行”sign=0时显示为“未执行”
- C#中默认的方法参数类型是引用类型吗?
- C# WINFORM,如何用反射打开窗体,同时实现窗体单例模式?
- 紧急!!!c#注册tomcat
这代码真懒的看,不知道的还以为是反编译出来的
这些都需要重新new一下的,
strlist2 = strlist; 这样用的还是同一个地址,操作的还是同一个对象。
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;
}
这样子可以吗?
贴下我的代码
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;
}
能问下 有什么问题吗?我想了半天也没想到啊
1、IEnumerable.GetEnumerator方法,返回一个循环访问集合的枚举数。
2、有些语言提供一个隐藏直接使用枚举数的复杂性的语句。比如:C# foreach 语句使用枚举数。C#语言的foreach语句隐藏了枚举数的复杂性。因此,建议使用foreach,而不直接操作枚举数。
3、.NET Framework 提供枚举数作为循环访问一个集合的简单方法。枚举数只读取集合中的数据,无法用于修改基础集合。foreach循环的行为过程分析:
1、通过调用GetEnumerator方法获取对象的枚举数。
2、从枚举数中请求每一项并且把它作为迭代变量,代码可以读但不可以改变。这样来说的话,用foreach循环某个集合A的时候,那在循环过程中就不能修改这个集合A。否则就会出现“集合已修改; 列舉作業可能尚未執行。”这样的错误。而用for循环则不会这样。我感觉你就是这个地方出了问题。
a = strlist[i];
List<int> strlist2 = new List<int> { };
strlist2 = strlist;
我每次在remove之前把原来的数组赋给了一个新的数组,然后foreach循环的是新数组的元素,依次下去。也就是说在foreach循环中我根本没有改变过它的元素!
strlist2和strlist是同一个东西,改strlist2就是该strlist
仔细看看引用类型和值类型的区别
strlist2.Remove(i2);这弄错了吧 应该是strlist3 = strlist2;
strlist3.Remove(i2);
[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;
}