枚举就是猜测每一种可能性,比如1 + [ ] = 3,如果不用代数计算的话,那么就把0~9都尝试一遍,即可得出答案。
循环实现的枚举
考虑这样的一个问题,[ ][ ]+[ ][ ] = 51 空格中,数字随意填写,可重复,不考虑0。
我们通过四层for循环,分别遍历1~9暴力枚举所有数字组合可能性,来得出答案。
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int main()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= 9; j++)
{
for (int k = 1; k <= 9; k++)
{
for (int x = 1; x <= 9; x++)
{
if (i * 10 + j + k * 10 + x == 51) //判断是否符合[ ][ ]+[ ][ ] = 51
printf("%d%d + %d%d = 51\n", i, j, k, x);
}
}
}
}
system("pause");
return 0;
}
运行结果是这样的:
递归实现的枚举
这是通过不断调用自己来实现的枚举,他非要重要,这种递归调用可以模拟无限个for。
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int b[10];
void a(int s)
{
if (s == 5) //s等于5代表这个一个新的组合,可以判断是否合法了
{
if (b[1] * 10 + b[2] + b[3] * 10 + b[4] == 51)//判断
printf("%d%d + %d%d = 51\n", b[1], b[2], b[3], b[4]); //打印
return;
}
for (int i = 1; i <= 9; i++) //遍历1到9
{
b[s] = i;//第一次进入s是1,i也是1
a(s + 1); //然后调用自己,s+1,这样下一次进入就是s就是2
}
return;
}
int main()
{
a(1);
system("pause");
return 0;
}
其结果和之前一样