算法思路
枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:
- 可预先确定候选答案的数量;
- 候选答案的范围在求解之前必须有一个确定的集合。
实例1:填数游戏
算法描述题
x 算
—————
题题题题题题
#include "stdafx.h"
#include <stdio.h>
int main()
{
int n1, n2, n3, n4, n5;
long multi, result;
for (n1 = 1; n1 <= 9; n1++)
for (n2 = 0; n2 <= 9; n2++)
for (n3 = 0; n3 <= 9; n3++)
for (n4 = 0; n4 <= 9; n4++)
for (n5 = 0; n5 <= 9; n5++)
{
multi = n1*10000 +n2*1000 +n3*100 +n4*10 +n5;
result = n5*100000+n5*10000+n5*1000+n5*100+n5*10+n5;
if (result == multi*n1)
{
printf("\n%5d%2d%2d%2d%2d\n", n1, n2, n3, n4, n5);
printf("X%12d\n", n1);
printf("_____________\n");
printf("%3d%2d%2d%2d%2d%2d\n",n5,n5,n5,n5,n5,n5);
}
}
getchar();
return 0;
}
实例2:填运算符
5 5 5 5 5=5
由于算术表达式的特殊性,在编程求解时,注意:
- 当填入除号时,要求右侧的数不能为0
- 乘除运算级别比加减高
5+5-5*5/5 = 5
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
int main()
{
int j, i[5]; //循环变量,数组i用来表示4个运算符
int sign; //累加运算时的符号
int result; //保存计算式的结果值
int count = 0; //计数器,统计符合条件的方案
int num[6]; //保存操作数
float left, right; //保存中间结果
char oper[5] = { ' ', '+', '-','*','/' }; //运算符
printf("Please input 5 number: ");
for (j = 1; j <= 5; j++)
{
/*
为什么不用scanf()
使用scanf的警告是vs认为scanf函数本身不安全,建议使用scanf_s
*/
scanf_s("%d", &num[j]);
}
printf("Please input result:");
scanf_s("%d",&result);
for (i[1] = 1; i[1] <= 4; i[1]++) //循环四种运算, 1+, 2-, 3*, 4/
if ((i[1] < 4) || (num[2] != 0)) //运算符若是/,则第二个运算数不能为0
for (i[2] = 1; i[2] <= 4; i[2]++)
if ((i[2] < 4) || (num[3] != 0))
for (i[3] = 1; i[3] <= 4; i[3]++)
if ((i[3] < 4) || (num[4] != 0))
for (i[4] = 1; i[4] <= 4; i[4]++)
if ((i[4] < 4) || (num[5] != 0))
{
left = 0;
right = num[1];
sign = 1;
for (j = 1; j <= 4; j++)
{
switch (oper[i[j]])
{
case '+':
left = left + sign*right;
sign = 1;
right = num[j + 1];
break;
case '-':
left = left + sign*right;
sign = -1;
right = num[j+1];
break;
case '*':
right = right*num[j + 1];
break;
case '/':
right = right / num[j + 1];
break;
}
}
if (left + sign*right == result)
{
count++;
printf("%3d: ",count);
for (j = 1; j <= 4; j++)
printf("%d%c",num[j],oper[i[j]]);
printf("%d=%d\n",num[5],result);
}
}
if (count == 0) printf("No!\n");
while(getchar()!='q'); //输入小字字母 'q'退出
return 0;
}