枚举思想解决“运算操作符”问题

2019-04-17  本文已影响0人  Kris_Ni
Q :在下面的算式中,添加"+" "-" "x" "/" 4个运算符(可重复),使得这个等式成立
    5 ? 5 ? 5 ? 5 ? 5 = 5

看上去很简单的问题对吧,只要利用枚举思想把所有情况都列举出来
然后验证等式是否成立就okay了
但是,乘除的优先级是比加减的优先级要高的
这就导致了算式怎么去计算的问题,如果是任意5个数呢?还有保证不会出现除0错误
其实很简单,只需要强制让 "/" 后面的值不为0就可以解决除零问题
通过定义leftright变量来来优先处理"x""/"操作,保存中间结果
通过sign定义运算时的符号就可以很快解决问题了
话不多数,代码撸先

import java.util.Scanner;

public class OperationProblem {
    public static void main(String[] args) {
        int[] i = new int[4];//表示4个运算符
        int sign;//累加运算时的符号
        int result; //结果
        int count = 0; //计数
        int[] num = new int[5]; //输入的5个数字
        float left,right; //保存中间结果
        char[] oper = new char[]{'+','-','*','/'};
        System.out.println("请输入5个数,之间用空格隔开:");
        Scanner scanner = new Scanner(System.in);
        for (int j=0;j<5;j++) {
            num[j] = scanner.nextInt();
        }
        System.out.println("请输入想要的结果:");
        result = scanner.nextInt();
        for (i[0] = 0;i[0]<4;i[0]++) {
            if (i[0] < 3 || num[1] != 0) {
                for (i[1] = 0 ;i[1]< 4;i[1]++) {
                    if (i[1] < 3 || num[2] != 0) {
                        for (i[2]=0;i[2]<4;i[2]++) {
                            if (i[2] < 3 || num[3]!=0) {
                                for (i[3] = 0;i[3]<4;i[3]++) {
                                    if (i[3]<3 || num[4] != 0) {
                                        left = 0;
                                        right = num[0];
                                         sign = 1;
                                        for (int j=0;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++;
                                            System.out.println("count :" + count);
                                            for (int j=0;j<4;j++) {
                                                System.out.print(num[j]+" "+ oper[i[j]] +" ");
                                            }
                                            System.out.println(num[4]+" = "+result);
                                            System.out.println();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        if (count == 0) {
            System.out.println("没有符合要求的算式!");
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读