算法编程例题——枚举法

例一:百钱买白鸡

1,问题描述:

公鸡每只5元,母鸡每只3元,三只小鸡1元,用100元买100只鸡,问公鸡、母鸡、小鸡各多少只?


例二:使用枚举法解决“填写运算符问题”

1,问题描述:在下面的算式中,添加“+”、“-”,“*”,“/”,4个运算符,使得这个式子成立。

5  5  5  5  5=5

例一:

public static void buyChicken() {
		int gj = 0;
		int mj = 0;
		int xj = 0;
		int sum = 0;
		for (gj = 0; gj < 20; gj++) {
			for (mj = 0; mj <= 33; mj++) {
				xj = 100 - mj - gj;
				if (xj % 3 == 0 && xj * 1 / 3 + 5 * gj + 3 * mj == 100) {
					System.out.println("公鸡:" + gj + "母鸡:" + mj + "小鸡:" + xj);
				}
			}
		}
	}

例二:

public static void yunSuan() {
		int j = 0;   //遍历变量
		int i[] = new int[5];//表示四个运算符
		int sign;//累加运算时的符号
		int result = 0;//最终运算结果
		int count = 0;//可能的结果数

		float left, right;//运算过程中位于符号左右的结果

		char oper[] = { ' ', '+', '-', '*', '/' };//char型符号,用于打印
		Scanner a = new Scanner(System.in);//输入五个操作数和想要获得的运算结果
		int n = 6;
		int[] arr = new int[n];
		for (int m = 0; m < n; m++) {//将输入的五个数放入数组
			int x = a.nextInt();
			arr[m] = x;
		}
		for (int y = 0; y < arr.length; y++) {//打印需要运算的五个数
			System.out.print(arr[y]);
		}
		for (i[1] = 1; i[1] <= 4; i[1]++) 
// 循环4种运算符,1表示+,2表示-,3表示*,4表示  将0设置为空不使用,是为了可以利用同一个j进行操作数数组和运算符数组的遍历。
		{
			if ((i[1] < 4) || (arr[2] != 0)) // 运算符若是/,则第二个运算数不能为0,(注:“||”是或运算,两个条件至少要有一个成立,即第一个运算符为/时,第二个运算数不为0)
			{
				for (i[2] = 1; i[2] <= 4; i[2]++) {
					if ((i[2] < 4) || (arr[3] != 0)) // 当第二个运算符为/时,第三个运算数不为0
					{
						for (i[3] = 1; i[3] <= 4; i[3]++) {
							if ((i[3] < 4) || (arr[4] != 0)) // 当第三个运算符为/时,第四个运算数不为0
							{
								for (i[4] = 1; i[4] <= 4; i[4]++) {
									if ((i[4] < 4) || (arr[5] != 0)) // 当第四个运算符为/时,第五个运算数不为0
									{

										// 主要运算步骤
										left = 0;
										right = arr[1];//取操作数的第一个
										sign = 1;//将char类型运算符数组对应转化为sgin
									// 使用case语句,将4种运算符填到对应的空格位置,并进行计算
										for (j = 1; j <= 4; j++) {
											switch (oper[i[j]]) {
											case '+':
											left = left + sign * right;//将计算结果变为左
												sign = 1;
												right = arr[j + 1];//将操作数数组索引后移
												break;
											case '-':
												left = left + sign * right;
												sign = -1;
												right = arr[j + 1];
												break;
											case '*':
												right = right * arr[j + 1];
												break;
											case '/':
												right = right / arr[j + 1];
												break;
											}
										}

										result = arr[5];

										// 开始判断,如果运算式子的结果和输入的结果相同,则表示找到一种算法,并输出这个解
										if (left + sign * right == result) {
											count++;

											for (j = 1; j <= 4; j++)
											System.out.print(arr[j] + "" + oper[i[j]]);
											System.out.print("=" + result);
											System.out.println();
											System.out.println(count + ":");
										}

									}
								}
							}

						}
					}
				}
			}
		}

	}

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值