今天看到一道题 abcd*e=fghi (其中a,b,c,d,e,f,g,h,i 刚好是1~9中的数字) 用程序求出他们的值,其实这样类似的题 在中学会经常遇到,不过那时的解法大概都是乱猜,把数字才出来,有时运气好点一会就能才出答案,有时就会很费时间,今天学了程序,就用程序解解,首先是建模,有9个变量,每个都有可能是1~9中的数,我首先想到的for 循环 条件就是他们各不相同,下面开始写程序了
static void Main(string[] args)
{
//定义要用到的变量 abcd是四位数,fghi是得出的四位数
int a = 0, b = 0, c = 0, d = 0, e = 0, f, g, h, i, abcd, fghi;
for (a = 1; a < 10; a++)
for (b = 1; b < 10; b++)
{
if (b == a) //a与b不能重复
{
continue;
}
for (c = 1; c < 10; c++)
{
if (c == a || c == b) //c与a,b都不能重复
{
continue;
}
for (d = 1; d < 10; d++)
{
if (d == a || d == b || d == c) //d与a,b,不能重复
{
continue;
}
for (e = 1; e < 10; e++)
{
if (e == a || e == b || e == c || e == d) //e与a,b,c,d不能重复
{
continue;
}
abcd = (a * 1000 + b * 100 + c * 10 + d); //求出这个四位数
fghi = abcd * e; //按条件求出fghi
if (fghi.ToString().Contains(a.ToString()) || fghi.ToString().Contains(b.ToString()) || fghi.ToString().Contains(c.ToString()) ||
fghi.ToString().Contains(d.ToString()) || fghi.ToString().Contains(e.ToString()) || fghi.ToString().Contains("0") || fghi.ToString().Length > 4)
{
//判断这个fghi四否是四位数,并且里面的千,百,十,个位数中是否含有a,b,c,d,e,0
}
else
{
f = fghi / 1000;
g = (fghi % 1000) / 100;
h = ((fghi % 1000) % 100) / 10;
i = ((fghi % 1000) % 100) % 10;
//在符合的fghi结果中再次通过 f,g,h,i各不相同进行最后一次筛选
if (f != g && f != h && f != i && g != h && g != i && h != i)
//输出得到的结果
Console.WriteLine("abcd *e = fghi 值为:{0}*{1}={2}", abcd.ToString(), e.ToString(), fghi.ToString());
}
}
}
}
}
Console.ReadKey();
}
输出结果:
算完这个后让我想到一个数学题
|
a |
b |
c |
|
d |
e |
f |
|
g |
h |
i |
这个刚好也是9个变量 要求所有横或者竖或者斜相加等于一个长数,这个是有技巧的,不过我忘了,所以有时都是试出来的,刚好上面已经定义了9个变量,我就想着和上面同样的方法 来球下面这个题
static void Main(string[] args)
{
int a, b, c, d, e, f, g, h, i;
//这里和上面一题的思路基本都是一致的,在每个数取值都是从1至9,每个数不同的原则
for (a = 1; a < 10; a++)
{
for (b = 1; b < 10; b++)
{
if (b == a)
{
continue;
}
for (c = 1; c < 10; c++)
{
if (c == a || c == b)
{
continue;
}
for (d = 1; d < 10; d++)
{
if (d == a || d == b || d == c)
{
continue;
}
for (e = 1; e < 10; e++)
{
if (e == a || e == b || e == c || e == d)
{
continue;
}
for (f = 1; f < 10; f++)
{
if (f == a || f == b || f == c || f == d || f == e)
{
continue;
}
for (g = 1; g < 10; g++)
{
if (g == a || g == b || g == c || g == d || g == e || g == f)
{
continue;
}
for (h = 1; h < 10; h++)
{
if (h == a || h == b || h == c || h == d || h == e || h == f || h == g)
{
continue;
}
for (i = 1; i < 10; i++)
{
if (i == a || i == b || i == c || i == d || i == e || i == f || i == g || i == h)
{
continue;
}
else
{
//这里是条件的筛选,(b+c)==(e+i)实际是(a+b+c)==(a+e+i),为了简便点把a消掉了
//由于a~i有9个数,横竖斜共有8个,如果一次性比较if里会比较多,所以我就分两两为
//一组,4---2----1 最后得出结果
if ((b + c) == (d + g) && (a + i) == (d + f) && (g + i) == (b + e) && (f + i) == (e + g))
{
if ((b + c) == (e + i) && (g + h) == (c + f))
{
if ((a + b + c) == (g + h + i))
{
Console.WriteLine("{0},{1},{2},{3},{4},{5},{6},{7},{8}", a.ToString(), b.ToString(), c.ToString(), d.ToString(), e.ToString(), f.ToString(), g.ToString(), h.ToString(), i.ToString());
}
}
}
}
}
}
}
}
}
}
}
}
}
Console.ReadKey();
}
最后结果:
总结:
经过这两题发现原来的很多难题用程序会变的简单,虽然要写一些代码,在这些代码中只需知道所求问题的变量和条件,就可以了,虽然没遇到过实际问题,但一切问题应该都可以提取一些变量,这些变量再加上条件,再用上程序就会节省很所时间。。。
PS:我的代码写的比较烂。。。
做个推广:手赚联盟http://shouzhuan.org
浙公网安备 33010602011771号