今天看了一下<啊哈!算法>这本书,书中提到了一个很有意思的算法,使用火柴棒搭A+B=C;等式中A,B,C均用火柴棍拼出来的整数,数值0-9的拼法如下图所示:
注意事项:
- 加号与等号各自需要两根火柴棍
- 如果A<>B,则A+B=C与B+A=C视为不同的等式(A,B,C都大于0)
- 所有火柴棒都必须用上。
假设总数不超过11111
C#代码如下
#region 算法搭火柴棍
/// <summary>
/// 算法搭火柴棍
/// </summary>
public void MatchAlgorithm()
{
Console.Write("请输入一个数字:");
int m = Convert.ToInt32(Console.ReadLine());
int a, b, c, sum = 0;
for (a = 0; a <= 11111; a++)
{
for (b = 0; b < 11111; b++)
{
c = a + b;
if (fun(a) + fun(b) + fun(c) == m - 4)
{
Console.WriteLine("{0}+{1}={2}", a, b, c);
sum++;
}
}
}
if (sum == 0)
{
Console.WriteLine("此数字{0}未找到匹配的等式:",m);
}
}
/// <summary>
/// 通过数组下标来获取对应的火柴棍数量
/// </summary>
/// <param name="x">A,B,C的值</param>
/// <returns></returns>
public static int fun(int x)
{
int num = 0;
//f数组下标来对应0,1,2,3,4,5,6,7,8,9;
//对应的值来对应各个下标所需要的火柴棍
int[] f = new int[10] { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
while (x / 10 != 0)
{
num += f[x % 10];
x = x / 10;
}
num += f[x];
return num;
}
#endregion