1 2 3 4 5 6 7 8 9 = 81 在1-9之间添加加减乘除号,使等式成立

  1 /************************************************************************/
  2 /* 1 2 3 4 5 6 7 8 9 = 81 在1-9之间添加加减乘除号,使等式成立。                                                                     */
  3 /************************************************************************/
  4 #include <iostream>
  5 using namespace std;
  6 
  7 bool stop = false;    //控制遍历终止
  8 int count_ = 0;        //计算结果数量
  9 int count_loop = 0;    //计算循环次数
 10 
 11 void trans(int* arr, int index)    //从右往左递增遍历
 12 {
 13     if(index < 0)
 14         return;
 15     int temp = arr[index] / 4;
 16     if(temp <= 0)    //判断是否需要进位
 17         return;
 18     arr[index] = arr[index] % 4;
 19     if(index == 0)    //判断是否已经遍历完
 20     {
 21         stop = true;
 22         return;
 23     }
 24     arr[index - 1] += temp;
 25     trans(arr, index - 1);
 26 }
 27 
 28 void show(int* symbol, int len)    //处理每次遍历结果,并显示正确项
 29 {
 30     float number[9]= {1,2,3,4,5,6,7,8,9};
 31     int symbol_copy[9];
 32     for(int i = 0; i < 9; ++i)
 33     {
 34         symbol_copy[i] = symbol[i];
 35     }
 36     /*
 37     计算出带乘除号的结果,将前面的项置为0,符号沿用前面的符号
 38     */
 39     for(int i = 0; i < len -1; i++)        //合并乘除项
 40     {
 41         if(symbol_copy[i] == 2 || symbol_copy[i] == 3)
 42         {
 43             if(symbol_copy[i] == 2)            //计算合并后的结果
 44             {
 45                 number[i+1] = number[i] * number[i+1];
 46             }
 47             else if(symbol_copy[i] == 3)
 48             {
 49                 number[i+1] = number[i] / number[i+1];
 50             }
 51             number[i] = 0;//合并后将前一个数置零
 52 
 53             if(i == 0)
 54                 symbol_copy[i] = 0;
 55             else
 56                 symbol_copy[i] = symbol_copy[i-1];    //乘除结果合并,符号替换成前面的符号
 57         }
 58     }
 59 
 60     float num = number[0];
 61     for(int i = 0; i < len - 1; ++i)    //计算结果
 62     {
 63         if(symbol_copy[i] == 0)
 64             num += number[i+1];
 65         else if(symbol_copy[i] == 1)
 66             num -= number[i+1];
 67     }
 68 
 69     if(num == 81)//打印正确等式
 70     {
 71         count_++;
 72         for(int i = 0; i < len -1; ++i)
 73         {
 74             cout<<i+1;
 75             if(symbol[i] == 0)
 76                 cout<<"+";
 77             else if(symbol[i] == 1)
 78                 cout<<"-";
 79             else if(symbol[i] == 2)
 80                 cout<<"*";
 81             else if(symbol[i] == 3)
 82                 cout<<"/";
 83         }
 84         cout<<"9=81"<<endl;
 85     }
 86 }
 87 
 88 
 89 int main()
 90 {
 91     int  symbol[9] = {0};// [0:+ 1:- 2:* 3:/]
 92     int len = 9;
 93     while(!stop)
 94     {
 95         show(symbol, len);
 96         symbol[len-2]++;
 97         trans(symbol, len-2);
 98         count_loop++;
 99     }
100     cout<<""<<count_<<" 种可能"<<endl;
101     cout<<"遍历了"<<count_loop<<""<<endl;
102     system("pause");
103     return 0;
104 }

转载于:https://www.cnblogs.com/felove2013/p/4390617.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用栈来实现该计算,以下是示例代码: ```java import java.util.*; public class Calculator { public static void main(String[] args) { String a = "((3 2)*1) 2*-4/(8-6) 7"; System.out.println(eval(a)); } public static int eval(String expr) { Stack<Integer> stack = new Stack<>(); int num = 0; int sign = 1; for (int i = 0; i < expr.length(); i++) { char c = expr.charAt(i); if (Character.isDigit(c)) { num = num * 10 + (c - '0'); } else if (c == '(') { stack.push(sign); sign = 1; } else if (c == ')') { stack.pop(); } else if (c == '+' || c == '-') { stack.push(sign); sign = (c == '+') ? 1 : -1; } else if (c == ' ') { continue; } else { // operator: * or / int top = stack.isEmpty() ? 1 : stack.peek(); if (top == 1) { stack.pop(); num *= sign; stack.push(num); } else { stack.pop(); num *= sign * stack.pop(); stack.push(num); } num = 0; } } int result = 0; while (!stack.isEmpty()) { result += stack.pop(); } return result; } } ``` 该代码中,expr 是待计算的表达式,它会被依次遍历每个字符。如果遇到数字,则将其转换成整数;如果遇到左括,则将当前符入栈,并将符重置为 1;如果遇到右括,则将左括出栈;如果遇到加或减,则将当前符入栈,并将符重置为 1 或 -1;如果遇到空格,则跳过;如果遇到乘或除,则弹出栈顶符,将当前符与栈顶符乘积后更新当前数字,然后再将其入栈。最后,将栈中剩余的数字相加得到最终结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值